一個類,它可能有基類,也可能存在多個基類,這些類裡面還可能是虛擬基類,並且在類的本身也可能存在對象成員。那麼所涉及的這些類或對象成員會以什麼樣的順序來調用它們各自的構造函數呢?今天我們就來舉例分析下。 執行以下程式: ~~~~ include using namespace std; class B ...
一個類,它可能有基類,也可能存在多個基類,這些類裡面還可能是虛擬基類,並且在類的本身也可能存在對象成員。那麼所涉及的這些類或對象成員會以什麼樣的順序來調用它們各自的構造函數呢?今天我們就來舉例分析下。
執行以下程式:
#include <iostream>
using namespace std;
class Base{
public:
Base(){
cout << "The constructor of Base" << endl;
}
};
class VBase{
public:
VBase(){
cout << "The constructor of VBase" << endl;
}
};
class VBase_{
public:
VBase_(){
cout << "The constructor of VBase_" << endl;
}
};
/* 普通繼承與虛繼承 */
class A : public Base, virtual public VBase_, virtual public VBase{
public:
A(){
cout << "The constructor of A" << endl;
}
};
class B{
public:
B(){
cout << "The constructor of B" << endl;
}
};
class D{
public:
D(){
cout << "The constructor of D" << endl;
}
};
class C : public B, public A{
public:
C(){
cout << "The constructor of C" << endl;
}
private:
/* 對象成員 */
D obj;
};
int main()
{
/* 實例化類 C */
C test = C();
return 0;
}
運行結果:
結論
C++多重繼承的構造執行順序:
1.首先執行虛基類的構造函數,多個虛基類的構造函數按照被繼承的順序構造;
2.執行基類的構造函數,多個基類的構造函數按照被繼承的順序構造;
3.執行成員對象的構造函數,多個成員對象的構造函數按照聲明的順序構造;
4.執行派生類自己的構造函數;
5.析構以與構造相反的順序執行;