//先看一段簡單的代碼,其中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),這樣的多重繼承方式稱爲:複製繼承。 更好的多重繼承方式爲:共享繼承,之後再加上例子研究。