C++ 虛基類的初始化
阿新 • • 發佈:2019-01-01
如果一個派生類有多個基類,而這些直接基類又有一個共同的基類,則在最終的派生類中會保留該間接資料成員的多份同名成員。
使用虛基類可使最終的派生類只保留共同基類的一份同名成員。
一般情況下,派生類的建構函式只需負責對其直接基類初始化,再由直接基類負責對間接基類初始化。
對虛基類的派生類:在最後的派生類中不僅要負責對其直接基類進行初始化,還要對虛基類初始化。
程式碼一:
#include <iostream> using namespace std; class A { public: A(){cout<< 'a';} int a; }; class B: public A { public: B(){cout<< 'b';} int b; }; class C: public A { public: C(){cout<< 'c';} int c; }; class D: public B, public C { public: D(){cout<< 'd';}; int d; }; int main() { D d; return 0; } //abacd
程式輸出abacd,呼叫類D的建構函式會先呼叫類D的直接基類的建構函式,因為按基類出現的順序呼叫構成函式,所以先呼叫類B的建構函式,同理:呼叫類B的建構函式,先呼叫類A的建構函式,所以輸出abacd
程式碼二:
<pre name="code" class="cpp">#include <iostream> using namespace std; int t= 0; class A { public: A(){cout<< 'a'; t++;} int a; }; class B: virtual public A { public: B(){cout<< 'b';} int b; }; class C: virtual public A { public: C(){cout<< 'c';} int c; }; class D: public B, public C { public: D(){cout<< 'd';}; int d; }; int main() { D d; cout<< t; return 0; } //abcd1
類D的建構函式通過初始化呼叫了虛基類的建構函式A,然後再呼叫類B和類C的建構函式。
那麼這裡類B和類C的建構函式會不會呼叫虛基類的建構函式A呢?
不會, 因為C++編譯相同只執行最後的派生類對虛基類的建構函式的呼叫,而忽略基類的其他派生類對虛基類的建構函式的呼叫