C++虚函数表机制
虚函数对类对象内存分布的影响
class Base1
{
public:
int base1_1;
int base1_2;
virtual void base1_fun1() {}
};
当类中添加一个虚函数后,类对象的成员变量base1_1和base1_2相对于没有虚函数时,地址会向后偏移4。原因在最前端添加了一个虚函数表指针,指向虚函数表。当类中有多个虚函数时,类的大小以及成员变量的地址偏移量并不会改变,因为虚函数时被添加到了虚函数表中,并不会改变类对象的大小。
同一个类的不同实例,使用同一份虚函数表。
继承有虚函数的基类
- 单继承
在单继承中,含有虚函数的基类在上面,继承类的成员在下面,如果派生类没有虚函数,基类的内存布局不会发生任何变化,继承类对基类进行虚函数覆盖时,继承类会重写所覆盖的基类虚函数表中的虚函数,定义基类中没有的虚函数的单继承的类,继承类的虚函数会被加到虚函数表的后面,但是基类并不知道,也不会对基类产生影响,如果基类没有虚函数而派生类多出来一个虚函数呢?,这个时候会为派生类创建一个虚函数表指针放在最前面。 - 多继承
如果继承的两个基类中,一个有个虚函数,一个没有虚函数,派生类中自定义虚函数的话,谁有虚函数就将谁放到前面,将派生类的虚函数追加到虚函数表的后面,如果两个基类都没有虚函数,会为派生类专门创建一个虚函数表指针。如果继承的类是三个,有,没有,有函数表,会将有虚函数表的放到前面,派生类的虚函数会追加到第一个有虚函数表的表后面。