C++-虚基类

C++-单重及多重继承的构造与析构

  1. 案例一:

    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;
    }
    
  2. 案例二:

    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;
    }
    
  3. 案例三:

    • 派生树从左到右,从下到上
    • 第一级:虚基类
    • 第二级:直接基类
    • 第三级:对象成员
    • 第四级:自身构造函数体
    • 当前类的构造函数和类中每个对象成员都是一棵独立的派生树
    • 每棵派生树的虚基类只构造和析构一次
    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;
    }
    

    C++-多继承派生树