1. 程式人生 > >C++中子類建構函式寫法總結

C++中子類建構函式寫法總結

        最近幾天在看《C++程式設計實戰》的時候,在一段程式碼中遇到了C++繼承的建構函式該怎麼寫的問題,當時不是很明白。後來,自己上網查閱相關的資料,終於把這個問題搞清楚了。為了自己以後的不時之需,特地將其進行了一個簡要的總結。

       我們知道,構造方法是用來初始化類物件的。如果在類中沒有顯式地宣告建構函式,那麼編譯器會自動建立一個預設的建構函式;並且這個預設的建構函式僅僅在沒有顯式地宣告建構函式的情況下才會被建立建立。

       建構函式與父類的其它成員(成員變數和成員方法)不同,它不能被子類繼承。因此,在建立子類物件時,為了初始化從父類中繼承來的成員變數,編譯器需要呼叫其父類的建構函式。如果子類的建構函式沒有顯示地

呼叫父類的建構函式,則預設呼叫父類的無參建構函式,至於什麼事顯式呼叫,在下面會詳細說明!關於子類中建構函式的構造原則,總結如下,歡迎大家指導與批評。

         1.父類沒有宣告建構函式

         (1)子類也沒有宣告自己的建構函式,則父類和子類均由編譯器生成預設的建構函式。

         (2)子類中聲明瞭建構函式(無參或者帶參),則子類的建構函式可以寫成任何形式,不用顧忌父類的建構函式。在建立子類物件時,先呼叫父類預設的建構函式(編譯器自動生成),再呼叫子類的建構函式。

         2.父類只聲明瞭無參建構函式

         如果子類的建構函式沒有顯式地呼叫父類的構造,則將會呼叫父類的無參建構函式。也就是說,父類的無參建構函式將會被隱式地

呼叫。

         3.父類只聲明瞭帶參建構函式

         在這種情況下,要特別注意。因為父類只有帶參的建構函式,所以如果子類中的建構函式沒有顯示地呼叫父類的帶參建構函式,則會報錯,所以必需顯示地呼叫。關於建構函式的顯示呼叫,參見下例。

class animal
{
protected:       //成員變數,宣告為protected或者public,這裡選擇protected
	int height;  //若宣告為private,則不能被子類繼承訪問,會報錯
	int weight;
public:
	animal(int height,int weight)   //帶參的建構函式
	{
		this->height=height;
		this->weight=weight;
		cout<<"animal的帶參建構函式被呼叫"<<endl;
	}
	virtual ~animal()
	{
		cout<<"animal的解構函式被呼叫"<<endl;
	}
};
//子類
class fish:public animal
{
public:
	fish():animal(height,weight) //顯示呼叫父類的建構函式
	{
		cout<<"fish的建構函式被呼叫"<<endl;
	}
	virtual ~fish()
	{
		cout<<"fish的解構函式被呼叫"<<endl;
	}
};

在子類fish的建構函式中,加上一個冒號(:),然後加上父類的帶參建構函式,這就是父類建構函式的顯式呼叫。這樣,在子類的建構函式被呼叫時,系統就會去呼叫父類的帶參建構函式,從而實現初始化父類的成員變數。執行結果如下:

       

  4.父類同時聲明瞭無參和帶參建構函式

         在這種情況下,子類只需要實現父類的一個建構函式即可,不管是無參的還是帶參的建構函式。如果子類的建構函式沒有顯示地呼叫父類的建構函式(無參或帶參),則預設呼叫父類的無參建構函式。

//父類
class animal
{
protected:       //成員變數,宣告為protected或者public,這裡選擇protected
	int height;  //若宣告為private,則不能被子類繼承訪問,會報錯
	int weight;
public:	
	animal()
	{
		height=0;
		weight=0;
		cout<<"animal的無參建構函式被呼叫"<<endl;
	}
	animal(int height,int weight)   //帶參的建構函式
	{
		this->height=height;
		this->weight=weight;
		cout<<"animal的帶參建構函式被呼叫"<<endl;
	}
	virtual ~animal()
	{
		cout<<"animal的解構函式被呼叫"<<endl;
	}
};
//子類
class fish:public animal
{
public:
	fish()     //沒有顯示地呼叫父類的建構函式(無參或帶參),則預設呼叫父類的無參建構函式
	{
		cout<<"fish的建構函式被呼叫"<<endl;
	}
	virtual ~fish()
	{
		cout<<"fish的解構函式被呼叫"<<endl;
	}
};
執行結果如下:



總結以上幾條,可以歸納出C++中子類繼承父類時建構函式的寫法的規律:當父類有顯式地聲明瞭建構函式時,子類最低限度的實現父類中的一個;當父類沒有宣告建構函式時,子類可以不宣告建構函式或者任意地書寫建構函式。