(1)任何 虛擬基類的構造函數按照它們被繼承的順序構造;(#add 即聲明順序)
(2)任何非虛擬基類的構造函數按照它們被繼承的順序構造;
(3)任何成員對象的構造函數按照它們聲明的順序調用;
(4)類自己的構造函數。
例如:
//**********************
//** ch17_4.cpp **
//**********************
#include<iostream.h>
class OBJ1
{
public:
OBJ1(){ cout <<"OBJ1\n"; }
};
class OBJ2
{
public:
OBJ2(){ cout <<"OBJ2\n"; }
};
class Base1
{
public:
Base1(){ cout <<"Base1\n"; }
};
class Base2
{
public:
Base2(){ cout <<"Base2\n"; }
};
class Base3
{
public:
Base3(){ cout <<"Base3\n"; }
};
class Base4
{
public:
Base4(){ cout <<"Base4\n"; }
};
class Derived :public Base1, virtual public Base2,
public Base3, virtual public Base4
{
public:
Derived() :Base4(), Base3(), Base2(),
Base1(), obj2(), obj1()
{
cout <<"Derived ok.\n";
}
protected:
OBJ1 obj1;
OBJ2 obj2;
};
void main()
{
Derived aa;
}
運行結果爲:
Base2
Base4
Base1
Base3
OBJ1
OBJ2
Derived ok.
Derived的虛基類Base2和Base4最先構造,儘管它在Derived類中出現的順序不在最前面;Derived的非虛基類其次構造,不管它在Derived構造函數中出現的順序如何;Derived的組合對象obj1和。obj2隨後構造, 它以類定義時,數據成員排列順序爲準, 不管在Derived構造函數中出現順序怎樣;最後是Derived類構造函數本身。
->在語言中實現多繼承並不容易,這主要是編譯程序問題,還有模糊性問題。建議你如果可能,在進一步閱讀有關參考書之前,儘量避免用多重繼承。單個繼承提供了足夠強大的功能,不一定非用多重繼承不可。我們應先學會閱讀一些商品化的類庫源程序中有關多重繼承的部分,因爲那些都是經過測試的安全代碼。