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

    典型的菱形继承案例:

    image.png

    菱形继承问题:

    1. 1羊继承了动物的数据,羊驼同样继承了动物的数据,当草泥马使用数据时,就会产生二义性。<br /> 2草泥马继承了来自动物的数据继承了两份,其实我们因该清楚,这份数据我们只需要一份即可。

    示例:

    1. #include<iostream>
    2. using namespace std;
    3. //(虚基类)动物类
    4. class Animal
    5. {
    6. public:
    7. int m_Age=10;
    8. };
    9. //羊类
    10. class Sheep:virtual public Animal
    11. {
    12. public:
    13. // int m_Age=20;
    14. };
    15. //利用虚继承 解决菱形继承问题
    16. //继承之前 加上关键字 virtual 变为虚继承(即两个父类继承的数据是共享的)
    17. //Animal类称为 虚基类
    18. //驼类
    19. class Tuo:virtual public Animal
    20. {
    21. // int m_Age=30;
    22. };
    23. class SheepTuo:public Sheep,public Tuo
    24. {
    25. };
    26. void show()
    27. {
    28. SheepTuo p;
    29. p.Sheep::m_Age=18;
    30. p.Tuo::m_Age=20;
    31. //当菱形继承 两个父类拥有相同的数据时 需要加作用域用来区分。
    32. cout<<"sheep="<<p.Sheep::m_Age<<endl;
    33. cout<<"Tuo ="<<p.Tuo::m_Age<<endl;
    34. //菱形继承会导致数据有两份(即子类继承了两个父类的相同的数据) 造成资源浪费
    35. cout<<"SheepTuo="<<p.m_Age<<endl;
    36. }
    37. int main()
    38. {
    39. show();
    40. return 0;
    41. }

    总结:
    1菱形继承带来的主要问题是子类继承两份相同的数据,导致资源的浪费以及这两份数据是毫无意义的
    2利用虚继承可以解决菱形继承的问题。

    网址:https://www.bilibili.com/video/BV1et411b73Z?p=134