菱形继承和菱形虚拟继承探索

使用平台:vs2013
单继承&多重继承:
1. 单继承–一个子类只有一个直接父类时称这个继承关系为单继承
2. 多继承–一个子类有两个或以上直接父类时称这个继承关系为多继承
有了多继承,必然就会出现菱形继承
菱形继承:
菱形继承和菱形虚拟继承探索_第1张图片

菱形继承对象模型

class AA
{
//在这里只研究菱形继承的对象模型,为了方便研究,将访问限定符规定为public(便于在类外对成员变量赋值)
public:
    int _aa;
};
class BB :public AA
{
public:
    int _bb;
};
class CC :public AA
{
public:
    int _cc;
};
class DD :public BB,public CC
{
public:
    int _dd;
};

void Test()
{
    DD d;
    cout << sizeof(d) << endl;//20

    d.BB::_aa = 0;
    d.CC::_aa = 1;
    d._bb = 2;
    d._cc = 3;
    d._dd = 4;
    //菱形继承存在问题:二义性和数据冗余
    //通过调试,看内存窗口,研究d的对象模型(结果见下图)
    ////d._aa = 1;//编译失败,对_aa的访问不明确,通过d的对象模型可以知道在d对象模型中有两份_aa
    //d.BB::_aa = 0;
    //d.CC::_aa = 1;//加上作用域限定符,可以实现_aa的赋值,但是数据冗余问题并没有解决

}

菱形继承对象模型图

菱形继承和菱形虚拟继承探索_第2张图片

菱形虚拟继承

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;
};

void Test1()
{
    DD d;
    cout << sizeof(d) << endl;//猜想输出16;实际输出24
    //菱形虚拟继承对象模型研究(和上面研究方法类似)
    d.BB::_aa = 0;
    d.CC::_aa = 1;
    d._bb = 2;
    d._cc = 3;
    d._dd = 4;
}
int main()
{
    Test1();
    return 0;
}

菱形虚拟继承对象模型图

菱形继承和菱形虚拟继承探索_第3张图片
菱形继承和菱形虚拟继承探索_第4张图片

菱形虚拟继承解决了二义性和数据冗余的问题。

你可能感兴趣的:(C++,继承,菱形继承-菱形虚拟继)