C++中多重继承构造函数调用的先后顺序

时间:2023-01-10 19:32:48
//先看一段简单的代码,其中E、D是祖先类
#include<iostream>
using namespace std;

class E {
    public:
        E() {
            cout << "In E()" << endl;
        }
        ~E() {
            cout << "In ~E()" << endl; 
        }
};

class C {
    public:
        C() {
            cout << "In C()" << endl;
        }
        ~C() {
            cout << "In ~C()" << endl;
        }
};

class D : public E, public C {
    public:
        D() {
            cout << "In D()" << endl;
        }
        ~D() {
            cout << "In ~D()" << endl;
        }
};
 
class A : public C {
    public:
        A() {
            cout << "In A()" << endl;
        }
        ~A() {
            cout << "In ~A()" << endl;
        }
};

class B : public D, public A {
    public:
        B() {
            cout << "In B()" << endl;
        }
        ~B() {
            cout << "In ~B()" << endl;
        }
};

int main() {
    B b;
    return 0;
}

C++中多重继承构造函数调用的先后顺序

(由dev-C++通过)

这里面的E、C是最终的祖先类,D继承了E和C,A继承了C,最后B继承了D和A。

当在main函数中实例化类B之后,由运行结果及 继承顺序 class B : public D, public A 可知:编译器会从左向右扫描该语句,先构造类D(构造类D之前又需要根据类D的继承顺序先构造类E和类C),之后再构造类A(构造类A之前又需要构造类C),所以最终的构造顺序会是:E、C、D、C、A、B。 析构函数的调用顺序与构造函数恰好相反。

要注意的一点是:在该例中,类B通过类D和类A间接继承了两次类C,此时的类B中含有两份类C的拷贝,若C中含有数据成员,则可能会导致二义性(ambiguous),这样的多重继承方式称为:复制继承。 更好的多重继承方式为:共享继承,之后再加上例子研究。