1. 程式人生 > 程式設計 >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的建構函式中,加上一個冒號(:),然後加上父類的帶參建構函式,這就是父類建構函式的顯式呼叫。這樣,在子類的建構函式被呼叫時,系統就會去呼叫父類的帶參建構函式,從而實現初始化父類的成員變數。執行結果如下:

c++ 子類建構函式初始化及父類構造初始化的使用

注意:

如果父類只有帶參的建構函式,且該帶參的建構函式的引數有預設值,此時在子類中也可以不用顯示的呼叫父類的建構函式。

// 父類的建構函式,改成帶有預設值的引數, 這樣在子類中就可以不用顯示呼叫了
    animal(int height=19,int weight=20)  //帶參的建構函式
    {
        this->height=height;
        this->weight=weight;
        cout<<"animal的帶參建構函式被呼叫"<<endl;
    }

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++ 子類建構函式初始化及父類構造初始化的使用

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

到此這篇關於c++ 子類建構函式初始化及父類構造初始化的使用的文章就介紹到這了,更多相關c++ 子類建構函式初始化及父類構造初始化內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!