123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990 |
- //4.6.8 菱形继承
- //菱形继承概念:
- //两个派生类继承同一个基类
- //又有某个类同时继承这两个派生类
- //这种继承被称为菱形继承,或者钻石继承
- // 动 物
- // 🐏 🐫
- // 草泥马
- //菱形继承的问题:
- //1、🐏继承了动物的数据,🐫同样继承了动物的数据,当草泥马使用数据时,就会产生二义性
- //2、草泥马继承自动物的数据继承了两份,其实我们应该很清楚,这份数据我们只需要一份就可以
- #include <iostream>
- //动物类
- 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;
- }
- //总结:
- //⚪菱形继承带来的主要问题时子类继承两份相同的数据,导致资源浪费以及毫无意义
- //⚪利用虚继承可以解决菱形继承问题
|