菱形继承
下图展示了一个简单的菱形继承(假设是public方式继承)
菱形继承的问题
数据冗余和二义性
上图B和C都继承了A,B和C的数据中除了有自己的成员变量外,还有继承自A的成员:_a,此时D同时继承了B和C,那么D中除了自己有的成员变量以外,还包含了继承自B和C的成员变量,此时D中就同时有_b,_c,_d,_a 那么_a究竟是B中的还是C中的呢,而且多继承使得数据大量的重复堆积,使得派生类数据量庞大,这就是菱形继承的数据冗余和二义性的问题
如何解决这个问题
C++中提供了一种解决菱形继承带来的数据冗余和二义性的方法,虚继承
在继承方式前加上关键字:virtual就实现了虚继承
class A
{
public:
int _a;
};
// class B : public A
class B : virtual public A
{
public:
int _b;
};
// class C : public A
class C : virtual public A
{
public:
int _c;
};
class D : public B, public C
{
public:
int _d;
};
int main()
{
D d;
d.B::_a = 1;
d.C::_a = 2;
d._b = 3;
d._c = 4;
d._d &