//4.6.8 菱形继承 //菱形继承概念: //两个派生类继承同一个基类 //又有某个类同时继承这两个派生类 //这种继承被称为菱形继承,或者钻石继承 // 动 物 // 🐏 🐫 // 草泥马 //菱形继承的问题: //1、🐏继承了动物的数据,🐫同样继承了动物的数据,当草泥马使用数据时,就会产生二义性 //2、草泥马继承自动物的数据继承了两份,其实我们应该很清楚,这份数据我们只需要一份就可以 #include //动物类 class Animal { public: int m_Age; }; //利用虚继承 可以解决菱形继承的问题 //在继承前 加关键字 virtual 变为虚继承 //Animal类称为 虚基类 //vbptr 虚基类指针 -> vbtable 虚基类表 //v - virtual //b - base //ptr - pointer //继承了两个指针 指针通过偏移量找到唯一数据 //羊类 class Sheep :virtual public Animal { }; //驼类 class Tuo :virtual public Animal { }; //羊驼类 class SheepTuo : public Sheep, public Tuo { }; void test01() { SheepTuo st; st.Sheep::m_Age = 18; st.Tuo::m_Age = 28; //当出现菱形继承的时候,两个父类拥有相同的数据,需要加以作用域区分 std::cout << "st.Sheep::m_Age = " << st.Sheep::m_Age << std::endl; std::cout << "st.Tuo::m_Age = " << st.Tuo::m_Age << std::endl; std::cout << "st.m_Age = " << st.m_Age << std::endl; //这份数据我们知道 只要有一份就可以了 菱形继承导致数据有两份 资源浪费 } int main() { test01(); system("pause"); return 0; } //总结: //⚪菱形继承带来的主要问题时子类继承两份相同的数据,导致资源浪费以及毫无意义 //⚪利用虚继承可以解决菱形继承问题