Appearance
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;
}