《實用C 》第40課 子類的建構函式與析構函式

2021-09-03 07:18:04 字數 1555 閱讀 3551

1、子類的建構函式概述:

建構函式這個話題之前跟大家講解過多次了,在之前課上的示例**中也都有給大家寫過建構函式,包括帶引數的,不帶引數等等。如果是單獨的自己乙個類,那麼建構函式的知識點就是之前給大家講解的,這裡沒必要重複了。可現在我們講解到了類的繼承和派生,那麼子類的建構函式和父類的建構函式又是乙個什麼關係呢?定義乙個子類的物件會不會自動呼叫父類的建構函式呢?接下來我們帶著這些疑問來給大家講解下!

2、建構函式是否可以被繼承?

子類可以繼承父類所有的成員變數和成員函式,但不能繼承父類的建構函式。因此,在建立子類物件的時候,為了初始化從父類繼承來的資料成員,系統需要呼叫其父類的建構函式。

3、父類建構函式的呼叫規則:

①. 如果子類沒有定義建構函式,則呼叫父類的無引數的建構函式;

②. 如果子類定義了建構函式,不論是無引數還是帶引數,在建立子類的物件的時候,首先執行父類無引數的建構函式,然後執行自己的建構函式;

③. 在建立子類物件時候,如果子類的建構函式沒有顯示呼叫父類的建構函式,則會呼叫父類的預設無參建構函式;

④. 在建立子類物件時候,如果子類的建構函式沒有顯示呼叫父類的建構函式且父類自己提供了無參建構函式,則會呼叫父類自己的無參建構函式;

⑤. 在建立子類物件時候,如果子類的建構函式沒有顯示呼叫父類的建構函式且父類只定義了自己的有參建構函式,則會出錯(如果父類只有有引數的建構函式,則子類必須顯示呼叫此帶參建構函式);

以上總結起來就兩句話:

如果子類沒有顯示的呼叫父類的建構函式,那麼缺省會呼叫父類無參的建構函式!!!

如果父類只提供了有引數的建構函式,那麼子類在預設情況下呼叫父類的無參建構函式時就會報錯!

⑥. 如果子類呼叫父類帶引數的建構函式,需要用初始化父類成員物件的方式,例如:

class cxiaostudent : public cstudent

private:

int flag_private;

protected:

int flag_protected;};

4、子類的析構函式是否可以被繼承?

跟父類的建構函式一樣,子類也一樣不能繼承父類的析構函式,也需要通過派生子類的析構函式去呼叫父類的析構函式。在執行子類的析構函式時,系統會自動呼叫父類的析構函式和子物件的析構函式,對父類和子物件進行清理工作。

呼叫的順序跟建構函式正好相反:先執行子類自己的析構函式,對派生類新增加的成員進行清理,之後呼叫子物件的析構函式,對子物件進行清理,最後呼叫父類的的析構函式,對基類進行清理。

5、多重繼承:

關於多重繼承方面的知識點,在實際程式設計過程中用的不多,這裡不做課上講解,大家感興趣的話課後自己學習一下吧,也算是乙個小作業了!

6、小作業:

用乙個函式來實現乙個功能,分別統計全市在校學生的平均年齡。學生包括小學生、中學生、高中生、大學生 等。用乙個函式來實現!

下節課會給大家解答這個小作業,用的方法也是下節課即將要講解的,大家先事先自己試試吧!

C 中子類的建構函式

構造方法用來初始化類的物件,與父類的其它成員不同,它不能被子類繼承 子類可以繼承父類所有的成員變數和成員方法,但不繼承父類的構造方法 因此,在建立子類物件時,為了初始化從父類繼承來的資料成員,系統需要呼叫其父類的構造方法。如果沒有顯式的建構函式,編譯器會給乙個預設的建構函式,並且該預設的建構函式僅僅...

《實用C 》第42課 多型性與虛函式

1 多型性介紹 關於c 中物件導向的多型特性,這裡面先給大家介紹一下。什麼是多型性?多型,即多種形態。在c 中一般是這麼解釋的 向不同的物件傳送同乙個訊息,不同的物件在接收時會產生不同的行為。之前其實已經給大家有使用過了,就是成員函式的過載,或者運算子的過載等等,都算是多型性的一種體現。舉個現實中的...

c 類的建構函式及子類的建構函式

類在建立的時候需要呼叫建構函式,假如對系統沒有任何說明,則會呼叫系統預設的建構函式,在需要自行寫建構函式的時候往往是一下幾種情況 1.建構函式中不帶引數 includeusing namespace std class student student student void int student...