Skip to content
On this page

DiamondInheritance.cpp


标签:代码片段CPP/basic  
cpp
// diamond inheritance
#include <iostream>

using namespace std;

class A {
protected:
  int value_a;

public:
  A() { cout << "no parameter A constructor" << endl; }
  A(int a) : value_a(a) { cout << "A constructor" << endl; }
};

class B : virtual public A { 
protected:
  int value_b;

public:
  B() { cout << "no parameter B constructor" << endl; }
  B(int a, int b) : value_b(b), A(a) { cout << "B constructor" << endl; }
};

class C : virtual public A { 
protected:
  int value_c;

public:
  C() { cout << "no parameter C constructor" << endl; }
  C(int a, int c) : value_c(c), A(a) { cout << "C constructor" << endl; }
};

class D : public B, public C {
private:
  int value_d;

public:
  D() {}
  // D(int a1, int a2, int b, int c, int d) : value_d(d), B(a1, b), C(a2, c) {
  D(int a1, int a2, int b, int c, int d)        
      : value_d(d), A(a1), B(a1, b), C(a2, c) { 
    cout << "D constructor" << endl;
  }
  void show() {
    cout << "value_b = " << value_b << endl;
    cout << "value_c = " << value_c << endl;
    cout << "value_d = " << value_d << endl;
    // 直接继承不能直接使用,不确定是哪个父类继承的
    // 使用 Virtual 继承后,可以直接使用,但都是随机值
    // 直接调用公共基类的构造函数(传入 a1)后,结构都是 a1 了
    cout << "value_a = " << value_a << endl;    
    cout << "value_a = " << B::value_a << endl; 
    cout << "value_a = " << C::value_a << endl; 
  }
};

int main() {
  D d(1, 2, 3, 4, 5);
  d.show();
  return 0;
}

Last updated: