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