c 子類建構函式初始化及父類構造初始化

2022-06-16 04:15:10 字數 1403 閱讀 5099

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

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

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

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

2.父類只宣告了無參建構函式

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

3.父類只宣告了帶參建構函式

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

1

class

animal213

virtual ~animal()

1417

};18

//子類

19class fish:public

animal

2026

virtual ~fish()

2730 };

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

4.父類同時宣告了無參和帶參建構函式

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

1

//父類

2class

animal

314 animal(int height,int weight) //

帶參的建構函式

1520

virtual ~animal()

2124

};25

//子類

26class fish:public

animal

2733

virtual ~fish()

3437 };

執行結果如下:

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

C 子類初始化父類的構造函式呼叫總結

我們知道,構造方法是用來初始化類物件的。如果在類中沒有顯式地宣告建構函式,那麼編譯器會自動建立乙個預設的建構函式 並且這個預設的建構函式僅僅在沒有顯式地宣告建構函式的情況下才會被建立。建構函式與父類的其它成員 成員變數和成員方法 不同,它不能被子類繼承。因此,在建立子類物件時,為了初始化從父類中繼承...

關於初始化列表,父類建構函式以及子類建構函式

在stackoverflower上發現的乙個問題,覺得挺有意思,自己之前也沒有注意到,貼出來分享一下 這裡面的內容實在討論在子類的初始化列表中,如果對子類的成員變數進行初始化,然後呼叫父類的建構函式,那麼他們的執行順序會是什麼樣的,話不多說,碼來!includeusing namespace std...

C 類建構函式初始化列表,子類向父類傳引數

c 類建構函式初始化列表 建構函式初始化列表以乙個冒號開始,接著是以逗號分隔的資料成員列表,每個資料成員後面跟乙個放在括號中的初始化式。例如 cexample 建構函式內部賦值 cexample 上面的例子中兩個建構函式的結果是一樣的。上面的建構函式 使用初始化列表的建構函式 顯式的初始化類的成員 ...