C++Note继承 菱形继承
菱形继承概念:
两个派生类继承同一个基类
又有某个类同时继承这两个派生类
这种继承被称为菱形继承,或者钻石继承

菱形继承产生的问题:
1.羊继承了动物的数据,驼同样继承了动物的数据, 当羊驼使用数据时, 会产生二义性
2.羊驼继承自动物的数据继承了两份

vbptr:虚基类指针 指向 vbtable 指向同一个表

此时继承子类继承了两个指针指向了同一个地址
1 //动物类 2 class Animal 3 { 4 public: 5 int m_Age;//年龄 6 }; 7 // 利用虚继承 解决菱形继承的问题 8 // 再继承之前 加上关键字 virtual 9 // Animal称为 虚基类 10 //羊类 11 class Sheep :virtual public Animal {}; 12 //驼类 13 class Tuo :virtual public Animal {}; 14 //羊驼类 15 class SheepTuo :public Sheep, public Tuo {}; 16 17 void test() 18 { 19 SheepTuo st; 20 st.Sheep::m_Age = 18; 21 st.Tuo::m_Age = 28; 22 //当菱形继承,两个父类拥有相同数据,需要加作用域区分 23 cout << "st.Sheep::m_Age = " << st.Sheep::m_Age << endl; 24 cout << "st.Tuo::m_Age = " << st.Tuo::m_Age << endl; 25 //这个数据只需要一份 26 cout << "st.m_Age = " << st.m_Age << endl;//变为虚继承之后可以正常使用 27 }
总结:
菱形继承带来的主要问题是子类继承两份相同的数据,导致资源浪费
利用虚继承可以解决菱形继承的问题
浙公网安备 33010602011771号