1.虚继承
C++支持多继承,但当出现菱形继承时,可能会有数据冗余。
例如,类B,C都继承于A,那么类B,C中都包含A的成员变量,当有一个类D继承于B,C时,类D会包含B,C的成员变量,相应的便会有两份A的成员变量。为了解决这个问题,可以使用虚继承。
虚继承只需要在继承时声名virtual即可。
2.虚继承的内存分布
虚继承时,子类内存分布如下:
--虚基类表--------
--自身虚函数表--
--自身成员变量--
--基类虚函数表--
--基类成员变量--
父类不再是放在起始位置,而是以一个虚基类表指针代替,虚继承的父类追加在末尾。
虚基类表内存的是父类内存的偏移,即根据子类对象起始地址加多少偏移可以找到对于的父类虚表(或父类第一个成员变量,父类无虚表的情况)。
这样,上述菱形继承时,如果B,C均虚继承A,那么D中只会保留一个A的区域,B,C中分别保存对于虚基类表地址,从而可以根据B,C类对象指针加上查表得到的偏移找到对应的A类成员地址,如果A类有自己的虚函数的话,也可以通过这个方法找到对应的虚函数表,从而调用对应虚函数。