本文主要介绍C++中虚继承的相关内容
I、菱形继承
要了解C++的虚继承,首先要先了解菱形继承的概念及其带来的危害。
1、菱形继承是指一个派生来通过不同的继承途径,继承了同一个基类的内容,如下图所示:
2、上图中的继承关系会造成两个方面的影响,一是派生类D会存在两份基类A中的拷贝,这样会造成内存的浪费,而是在发生动态绑定时,会存在虚函数调用的二义性。
II、虚继承
1、虚继承就是为了解决上述的两个问题,虚继承的机构如下图所示:
2、虚继承的底层实现 :
虚继承一般通过虚基类指针和虚基类表实现,每个虚继承的子类都有一个虚基类指针和虚基类表(由虚基类指针指向)。
虚基类表中记录了虚基类与本类的偏移地址;通过偏移地址,就找到了虚基类成员,而虚继承也不用像普通多重继承一样需要维护两份拷贝,这样节省了存储空间。
3、上述描述解决了菱形继承中的浪费内存空间的问题,但还未解决二义性问题,在虚继承中,如果B和C都重写了A中的虚函数a(),则D必须重写虚函数a(),否则会出现二义性问题。
详细内容可以参考探索多态模型—菱形继承和菱形虚拟继承一文。