c++中的继承有单继承和多继承;本文主要探索的是多继承中菱形继承的二义性和数据冗余及解决方案;
菱形继承的对象模型:
从内存看菱形继承对象模型:
用一个简易 的代码来说明二义性和数据冗余这个问题:
class AA{
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 s;
s.BB::_aa = 0;
s.CC::_aa = 1;
s._bb = 2;
s._cc = 3;
s._dd = 4;
}
创建DD对象:
DD s;
s._aa = 1;访问_aa时会出现对_aa访问不明确的错误,可能是BB中的_aa,也可能是CC中的_aa;这就是二义性的问题;
可以指定所属类域来解决二义性问题,s.BB::_aa = 1; s.CC::_aa = 0; 但是这个并没有解决数据冗余的问题;
这就需要用到虚继承来解决二义性和数据冗余的问题;
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 test()
{
DD s;
s.BB::_aa = 0;
s.CC::_aa = 1;
s._bb = 2;
s._cc = 3;
s._dd = 4;
}
从内存看菱形虚拟继承对象模型:
由上图可以看出BB和CC中的_aa是同一个对象,解决了二义性和数据冗余的问题;