C 子類呼叫父類構造和析構函式的順序

2021-06-21 05:11:35 字數 665 閱讀 3531

#include 

using

namespace std;  

class a;  

class b : public a;  

int main()  

列印的結果是:  

construct a  

a  construct b  

b  destruct a  

a  

一般情況下構造函式呼叫父類-》子類;析構函式呼叫子類-》父類

比如這麼寫

b *a=new b(); 先  析構 b類 再析構a類 

但如果是上面那種寫法

a *a=new b();  

delete a;  

,結果就是 建構函式相同,析構函式只呼叫a,因為a的型別是a,delete a時將呼叫型別a的析構函式;沒析構b,造成記憶體洩露

一般遇到這樣的現象,需要將基類的析構函式定義為虛擬的.

還有一種情況是是析構函式是虛函式,結果是:析構函式呼叫子類-》父類,不過內部原理不一樣

delete a時呼叫型別a的析構函式步驟如下:

1,到虛函式對映表中查詢a的實際析構函式;

2,發現被例項化為b的析構函式;

3,呼叫b的析構函式;

4,呼叫a的析構函式---如果a的析構不是純虛函式的話。

C 子類構造和析構被時,父類構造和析構的呼叫順序

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

子類繼承和呼叫父類的構造 析構函式方法

先呼叫基類的建構函式,再呼叫派生類的建構函式就像蓋樓的時候先從地基開始,然後第一層,第二層。如果是析構 析構函式需要是是虛函式 那麼先呼叫派生類的析構函式,再呼叫基類的析構函式就像拆樓的時候想從最高層開始拆,然後往下一直到第一層 子類繼承和呼叫父類的構造方法 1.如果子類沒有定義構造方法,則呼叫父類...

C 父類與子類間構造,析構,拷貝的呼叫關係

子類的構造在執行它的建構函式前會根據繼承表的順序執行父類的建構函式 include include include using namespace std class base base const char str class a public base a const char str base...