1. 程式人生 > >C++ 虛基類的初始化

C++ 虛基類的初始化

如果一個派生類有多個基類,而這些直接基類又有一個共同的基類,則在最終的派生類中會保留該間接資料成員的多份同名成員。

使用虛基類可使最終的派生類只保留共同基類的一份同名成員。

一般情況下,派生類的建構函式只需負責對其直接基類初始化,再由直接基類負責對間接基類初始化。

對虛基類的派生類:在最後的派生類中不僅要負責對其直接基類進行初始化,還要對虛基類初始化。

程式碼一:

#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++編譯相同只執行最後的派生類對虛基類的建構函式的呼叫,而忽略基類的其他派生類對虛基類的建構函式的呼叫