菱形继承概念:
两个派生类继承同一个基类
又有某个类同时继承者两个派生类
这种继承被称为菱形继承,或者钻石继承
典型的菱形继承案例:
菱形继承问题:
1.羊继承了动物的数据,驼同样继承了动物的数据,当草泥马使用数据时,就会产生二义性。
2.草泥马继承自动物的数据继承了两份,其实我们应该清楚,这份数据我们只需要一份就可以。
#include <stdio.h>
#include <iostream>
using namespace std;
//动物类
class Animal {
public:
int m_A;
};
//利用虚继承 可以解决菱形继承问题
//在继承之前加上 关键字 virtual 变为虚继承
// Animal类称为 虚基类
//羊类
class Sheep:virtual public Animal{};
//驼类
class Tuo :virtual public Animal {};
//羊驼类
class Sheeptuo:public Sheep,public Tuo{};
void test01() {
Sheeptuo st;
st.Sheep::m_A = 18;
st.Tuo::m_A = 28;
//当菱形继承,两个父类具有相同的数据,需要加以作用域区分。
cout << "st.Sheep::m_A =" << st.Sheep::m_A << endl;
cout << "st.Tuo::m_A = " << st.Tuo::m_A << endl;
cout << "st,m_A=" << st.m_A << endl;
//这份数据我们知道 只要有一份即可,菱形继承导致数据有两份,资源浪费。
}
int main() {
test01();
return 0;
}
总结:
菱形继承带来的主要问题是子类继承两份相同的数据,导致资源浪费以及毫无意义
利用虚继承可以解决菱形继承问题