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 }
总结:
菱形继承带来的主要问题是子类继承两份相同的数据,导致资源浪费
利用虚继承可以解决菱形继承的问题
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)