揭秘C++多态背后的虚函数表机制
·
一、纯虚函数和抽象类
那何为纯虚函数,何为抽象类呢?
1.1 纯虚函数
在虚函数的后面写上=0,则这个函数为纯虚函数,纯虚函数不需要定义实现(实现没啥意义因为要被派生类重写,但是语法上可以实现),纯虚函数只要声明即可。

纯虚函数也可以实现定义部分:

1.2 抽象类
我们先来看看什么是抽象?
抽象派画作:

就是某种程度说这个东西想表达的意思就是跟现实世界不对应,他不在现实世界中对应某一实体,不对应某个实体就不能实例化出对象
包含纯虚函数的类叫做抽象类,抽象类不能实例化出对象,如果派生类继承后不重写纯虚函数,那么派生类也是抽象类,派生类也不能实例化出对象
这是为什么?
如果派生类继承后不重写纯虚函数,派生类也是抽象类,纯虚函数某种意义上强制派生类重写虚函数,因为不重写就实例化不出对象。
- 抽象类不能实例化出对象:

- 派生类继承后不重写纯虚函数,派生类也是抽象类

- 派生类继承后重写纯虚函数,派生类就不是抽象类,就可以实例化出对象

那既然抽象类不能实例化出对象,为什么还要搞这个呢?
抽象类不能实例化出对象,但是可以定义指针,抽象类的指针可以指向派生类对象
- 总结:
纯虚函数适用于:
- 要强制派生类中重写这个虚函数,实现多态
- 基类中确实就是有些不想被实例化出对象的一些抽象的类别
ok,接下来,我们来看一道题:
下面编译为32位程序的运行结果是什么(D)
A. 编译报错 B. 运行报错 C. 8 D. 12

也许会有很多小伙伴会有疑惑?为什么是12呢?不应该是8吗?
ok,这就需要我们对多态的底层有一定的了解——
二、多态的原理
2.1 虚函数表指针
当我们运行上面题目中的代码时,会发现b的成员好像不止两个——

除了_b和_ch成员外,还有一个_vfptr,_vfptr是什么🤨?
ok,其实_vfptr是一个指针,对象中的这个指针我们叫做虚函数表指针(简称虚表指针),本质上是一个指针数组(虚函数指针数组)
当一个类里面有虚函数的时候,那这个对象中就会多一个指针,这个指针(_vfptr 虚函数表指针)会指向一张表 --> 指向一个数组,数组中存放的是虚函数的地址!!
更多推荐
所有评论(0)