什么是菱形继承?
菱形继承的问题
1.羊继承了动物的数据,骆驼也继承了动物的数据,当羊驼使用数据时,就会产生二异性
2.羊驼继承动物的数据继承了两份,但是这份数据我们只需要一份
例如
class A
{
public:
int m_a = 1;
A() { cout << "A()" << endl; }
~A() { cout << "~A()" << endl; }
};
class B :public A
{
public:
B() { cout << "B()" << endl; }
~B() { cout << "~B()" << endl; }
};
class C :public A
{
public:
C() { cout << "C()" << endl; }
~C() { cout << "~C()" << endl; }
};
class D :public C,public B
{
public:
D() { cout << "D()" << endl; }
~D() { cout << "~D()" << endl; }
};
加入测试函数
int main()
{
D d;
cout << "B::m_a的地址:" << &d.B::m_a << endl;
cout << "C::m_a的地址:" << &d.C::m_a << endl;
return 0;
}
我们查看D的内存模型
发现确实有两份数据,这样不但会造成二义性,并且还会造成资源浪费
解决方案
这时候需要使用虚继承技术
class A
{
public:
int m_a = 1;
A() { cout << "A()" << endl; }
~A() { cout << "~A()" << endl; }
};
class B :virtual public A
{
public:
B() { cout << "B()" << endl; }
~B() { cout << "~B()" << endl; }
};
class C :virtual public A
{
public:
C() { cout << "C()" << endl; }
~C() { cout << "~C()" << endl; }
};
class D :public C,public B
{
public:
D() { cout << "D()" << endl; }
~D() { cout << "~D()" << endl; }
};
最终,在派生类的最后面只会放1份虚基类的数据
我们查看以下虚继承的内存模型
这样菱形继承就解决了