这是她 发表于 2020-5-16 21:43:36

C++旅程第七站------菱形继承

本帖最后由 这是她 于 2020-5-17 20:32 编辑

In order to be irreplaceable one must always be different.               
                                                                                                                      菱形继承
      菱形继承(钻石继承):
      1、两个派生类继承同一个基类;
      2、又有某个类同时继承两个派生类;
#include<iostream>

using namespace std;

//爷爷
class AAA
{
      public:
                int m_long;
};

//利用虚继承可以解决菱形继承问题----子类继承两份相同的数据,导致资源浪费
//继承前加virtual 关键字后,变成虚继承
//此时公共的父类AAA->成为虚基类

//父亲
class BBB : virtual public AAA {};

class CCC : virtual public AAA {};

//儿子
class DDD : public BBB, public CCC {};

void test1()
{
      DDD p1;
      p1.m_long = 100;//不加virtual之前,这条语句是不可以执行的---因为编译器他不知道这个成员属性是哪的
      cout << "p1.m_long -> " << p1.m_long <<endl;
      
      cout << "----------------------------------------------------------" << endl;
      
      //菱形继承中,如果两个父类拥有相同的数据,使用作用域 :: 加以区分
      p1.BBB::m_long = 1;
      cout << "p1.BBB::m_long -> " << p1.BBB::m_long <<endl;
      cout << "p1.m_long -> " << p1.m_long << endl;
      //如果我们初始化了一个属性---那么这个属性无论谁调用都是最后更新的数据--------跟资源共享一样,大家都可以修改,保存最新数据
      
      cout << "----------------------------------------------------------" << endl;
      
      //下面这个例子也可以看出来,再用另一个类初始化属性,属性将变成最新数据
      p1.CCC::m_long = 2;
      cout << "p1.m_long -> " << p1.m_long << endl;
      cout << "p1.BBB::m_long -> " << p1.BBB::m_long <<endl;
      cout << "p1.CCC::m_long -> " << p1.CCC::m_long << endl;
}

int main()
{
      test1();
      
      return 0;
}
                                                   {:10_297:} 渣渣一个感谢各位大佬指教{:10_303:}

nizitao 发表于 2020-5-17 10:56:55

沙发{:10_256:}
页: [1]
查看完整版本: C++旅程第七站------菱形继承