-
案例一:
class A { public: int a; A(int x) :a(x) { } }; class B : public A { public: B(int x) :A(x) { // 这里初始化的是派生树中正常的基类 A } }; class C { public: C() { } }; class D : virtual public A, public C { public: D(int x) :A(x) { } }; class E : /*public A,*/ public B, public D { // 不允许存在直接基类和间接虚基类的情况 public: E(int x) : A(x), B(x + 5), D(x + 10) { // error C2385: 对“A”的访问不明确 // 所以要使用 B::A(x) 或者 D::A(x) // 此时初始化的都是派生树中虚基类 A } }; int main(){ E e(0); //cout << e.a << endl; // 二义性 cout << e.B::a << endl; // 5 派生树中正常基类 A 中的 a cout << e.D::a << endl; // 0 派生树中虚基类 A 中的 a cout << e.A::a << endl; // 5 派生树中正常基类 A 中的 a return 0; }
-
案例二:
struct A { A(){ cout << "A"; } }; struct B{ B(){ cout << "B"; } }; struct C { int a; int& b; const int c; C(char d):c(d), b(a) { a = d; cout << d; } }; struct D{ D(){ cout << "D"; } }; struct E : A, virtual B, C, virtual D { A x, y; B z; E() : z(), y(), C('C') { cout << "E"; } }; int main(){ E e; // BDACAABE return 0; }
-
案例三:
- 派生树从左到右,从下到上
- 第一级:虚基类
- 第二级:直接基类
- 第三级:对象成员
- 第四级:自身构造函数体
- 当前类的构造函数和类中每个对象成员都是一棵独立的派生树
- 每棵派生树的虚基类只构造和析构一次
struct A { A() { cout << "A"; } }; struct B { const A a; B() { cout << "B"; } }; struct C { C() { cout << "C"; } }; struct D { D() { cout << "D"; } }; struct E : A { E() { cout << "E"; } }; struct F : B, virtual C { F() { cout << "F"; } }; struct G : B { G() { cout << "G"; } }; struct H : virtual C, virtual D { H() { cout << "H"; } }; struct I : E, F, virtual G, H { E e; F f; I() : f(), e(), F(), E() { cout << "I"; } }; int main(){ I i; // CABGDAEABFHAECABFI return 0; }