C 繼承中的父類與子類的構造與析構

2022-03-18 04:40:26 字數 1411 閱讀 5162

子類繼承父類後,當建立子類物件,也會呼叫父類的建構函式

問題:父類和子類的構造和析構順序是誰先誰後?

class

base

~base()

};class son : public

base

~son()

};void

test01()

intmain()

執行結果:

總結:繼承中 先呼叫父類建構函式,再呼叫子類建構函式,析構順序與構造相反

重點:父類建構函式的呼叫規則:

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

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

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

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

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

以上總結起來就兩句話:

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

如果父類只提供了有引數的建構函式,那麼子類在預設情況下呼叫父類的無參建構函式時就會報錯!(那麼解決這個報錯,需要給子類加上呼叫父類有參建構函式的通知即可)

報錯:

#include using

namespace

std;

class

base

~base()

};class son : public

base

~son()

};void

test01()

intmain()

執行結果報錯:

修改後:

class

base

~base()

};class son : public

base

~son()

};void

test01()

intmain()

執行結果:

C 中父類與子類的繼承關係

c 中的父類與子類的繼承關係與c和c 中的類似,這裡先闡述最重要的一點 假如子類繼承了父類,那麼子類可以強制轉換為父類,並且保證編譯和執行都不出錯 但是父類強制轉換成子類的時候,編譯可以通過執行通不過。請看如下 using system using system.collections.generi...

C 中父類與子類的繼承關係

c 中的父類與子類的繼承關係與c和c 中的類似,這裡先闡述最重要的一點 假如子類繼承了父類,那麼子類可以強制轉換為父類,並且保證編譯和執行都不出錯 但是父類強制轉換成子類的時候,編譯可以通過執行通不過。請看如下 using system using system.collections.generi...

C 中的父類與子類

c 中的父類與子類的繼承關係與c和c 中的類似,這裡先闡述最重要的一點 假如子類繼承了父類,那麼子類可以強制轉換為父類,並且保證編譯和執行都不出錯 但是父類強制轉換成子類的時候,編譯可以通過執行通不過。所以子類只能強制轉化成父類,而父類不能直接轉化成子類。static void main strin...