//先看一段简单的代码,其中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; }
(由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),这样的多重继承方式称为:复制继承。 更好的多重继承方式为:共享继承,之后再加上例子研究。