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   廿陆  阅读(6)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示