8、菱形继承.cpp 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. //4.6.8 菱形继承
  2. //菱形继承概念:
  3. //两个派生类继承同一个基类
  4. //又有某个类同时继承这两个派生类
  5. //这种继承被称为菱形继承,或者钻石继承
  6. // 动 物
  7. // 🐏 🐫
  8. // 草泥马
  9. //菱形继承的问题:
  10. //1、🐏继承了动物的数据,🐫同样继承了动物的数据,当草泥马使用数据时,就会产生二义性
  11. //2、草泥马继承自动物的数据继承了两份,其实我们应该很清楚,这份数据我们只需要一份就可以
  12. #include <iostream>
  13. //动物类
  14. class Animal
  15. {
  16. public:
  17. int m_Age;
  18. };
  19. //利用虚继承 可以解决菱形继承的问题
  20. //在继承前 加关键字 virtual 变为虚继承
  21. //Animal类称为 虚基类
  22. //vbptr 虚基类指针 -> vbtable 虚基类表
  23. //v - virtual
  24. //b - base
  25. //ptr - pointer
  26. //继承了两个指针 指针通过偏移量找到唯一数据
  27. //羊类
  28. class Sheep :virtual public Animal
  29. {
  30. };
  31. //驼类
  32. class Tuo :virtual public Animal
  33. {
  34. };
  35. //羊驼类
  36. class SheepTuo : public Sheep, public Tuo
  37. {
  38. };
  39. void test01()
  40. {
  41. SheepTuo st;
  42. st.Sheep::m_Age = 18;
  43. st.Tuo::m_Age = 28;
  44. //当出现菱形继承的时候,两个父类拥有相同的数据,需要加以作用域区分
  45. std::cout << "st.Sheep::m_Age = " << st.Sheep::m_Age << std::endl;
  46. std::cout << "st.Tuo::m_Age = " << st.Tuo::m_Age << std::endl;
  47. std::cout << "st.m_Age = " << st.m_Age << std::endl;
  48. //这份数据我们知道 只要有一份就可以了 菱形继承导致数据有两份 资源浪费
  49. }
  50. int main()
  51. {
  52. test01();
  53. system("pause");
  54. return 0;
  55. }
  56. //总结:
  57. //⚪菱形继承带来的主要问题时子类继承两份相同的数据,导致资源浪费以及毫无意义
  58. //⚪利用虚继承可以解决菱形继承问题