使用平台:vs2013
单继承&多重继承:
1. 单继承–一个子类只有一个直接父类时称这个继承关系为单继承
2. 多继承–一个子类有两个或以上直接父类时称这个继承关系为多继承
有了多继承,必然就会出现菱形继承
菱形继承:
菱形继承对象模型
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的赋值,但是数据冗余问题并没有解决
}
菱形继承对象模型图
菱形虚拟继承
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;
}
菱形虚拟继承对象模型图
菱形虚拟继承解决了二义性和数据冗余的问题。