菱形继承和虚继承

来源:互联网 发布:嵌入式linux终端 编辑:程序博客网 时间:2024/05/30 07:12

1.菱形继承

菱形继承概念图:
菱形继承概念图

菱形继承对象模型:
菱形继承对象模型
参照菱形继承对象模型,不难发现若调用DD类时,里面包含两个相同的AA类的所有成员,在调用过程中会出现二义性和数据冗余的问题,为了解决上述问题,我们提出了虚继承。接下来通过简单实例代码讲解虚函数及底层实现。
代码样例:

#include <iostream>using namespace std;class AA{public:    int _aa;};class BB : virtual public AA{public:    int _bb;};class CC : virtual public AA{public:    int _cc;};class DD : public BB,public CC{public:    int _dd;};int main(){    DD d;    //cout << sizeof(d) << endl;    d.BB::_aa = 0;    d._bb = 1;    d.CC::_aa = 2;    d._cc = 3;    d._dd = 4;    system("pause");    return 0;}

通过代码样例,利用内存调试窗口我们可以观察到内存地址分配以及逐步赋值操作顺序和地址。
虚继承内存
图中的20和12是相对于AA地址的偏移地址。通过虚继承(+viryual关键字),DD中重复继承的类AA归于一个,解决了菱形继承中二义性的问题。
通过应用偏移地址,在赋值操作前,将两个相同且重复AA类地址分别赋予不同的偏移地址,保证其正确的存储。AA被分配到最底层的地址,通过内存一步步调试,观察赋值过程。
偏移地址
上图经过内存调试,通过地址可以看出其偏移地址。可以看出中间相差8个字节,通过多占用8个字节的空间,以空间换时间,解决数据冗余的问题。

0 0