对于派⽣类来说,编译器建立虚函数表的过程其实⼀共是三个步骤:
- 拷贝基类的虚函数表,如果是多继承,就拷贝每个有虚函数基类的虚函数表
- 查看派⽣类中是否有重写基类中的虚函数,如果有,就在基类的虚函数表基础上替换成已经重写的虚函数地址;
- 查看派⽣类是否有自身的虚函数,如果有,就追加自身的虚函数到自身的虚函数表中。
参考: c++虚函数表解析
2.0 追问:虚函数表里存放的内容是什么时候写进去的?
- 虚函数表是一个存储虚函数地址的数组,以NULL结尾。虚表(vftable)在编译阶段生成,对象内存空间开辟以后,写入对象中的 vfptr,然后调用构造函数。即:虚表在构造函数之前写入
- 除了在构造函数之前写入之外,我们还需要考虑到虚表的二次写入机制,通过此机制让每个对象的虚表指针都能准确的指向到自己类的虚表,为实现动多态提供支持。
2.1 追问: 虚函数表的结构是怎样的?
虚函数表是一个函数指针数组,数组里存放的都是函数指针,指向虚函数所在的位置
2.2 追问: A,B两个类, 类中有虚函数. C继承AB, 派生类有几张虚函数表? 为什么?
2张.
为什么是两张?
多继承就会有多个虚函数表。因为每个父类的虚函数是不同的,指针也是不同的。
多重继承无虚函数覆盖的例子:
如果共用一张虚函数表,就分不清到底子类的实例化是针对哪一个基函数的。
如果共用一张虚函数表,就分不清到底子类的实例化是针对哪一个基函数的。
