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 }

总结:

  菱形继承带来的主要问题是子类继承两份相同的数据,导致资源浪费

  利用虚继承可以解决菱形继承的问题

posted on 2023-07-25 17:19  廿陆  阅读(19)  评论(0)    收藏  举报

导航