子類構造和析構被執行時是否呼叫父類以及呼叫順序

2021-07-17 00:04:25 字數 1061 閱讀 4217

子類被構造的時候回先呼叫父類的建構函式

子類析構的 時候先析構子類後析構父類

如果直接用子類構造乙個父類的物件,刪除這個父類的物件不會呼叫子類的析構函式(父類的析構函式為虛函式除外)

示例**:

//a是乙個父類 , 析構函式不是虛函式

class a

~a() };

//b是a的子類

class b : public a

~b() };

//c是乙個父類 , 析構函式是虛函式

class c

virtual ~c() };

//d是c的子類

class d : public c

~d()

};

測試程式

a *a = new b();

delete a;

cout << "-----------------------------" << endl

delete a;//刪除父類,這時候由於a的析構函式不是虛函式,所以直接呼叫父類a的構造方法,不會呼叫子類b的構造方法

cout << "-----------------------------" << endl

delete b;//刪除子類,這時候會先呼叫子類b的析構函式,再呼叫父類a的析構函式

cout << "-----------------------------" << endl << endl;

c *c = new d();//同理,先呼叫父類c的構造方法,然後呼叫子類d的構造方法

delete c;//刪除父類,這時候由於a的析構函式是虛函式,所以直接先呼叫子類d的析構函式,再呼叫父類c的構造方法

執行結果:

昨天面試的時候面試官出了道此知識點的小題,說難倒了好多人,當時信心滿滿的寫出了答案,還解釋了一通,結果錯了 (尷了個尬) 

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

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

構造和析構的呼叫

1.不管基類析構函式加不加virtual,只要是宣告的是基類的指標,即使實際指向的例項是派生類的,也不會呼叫派生類的析構方法。2.不管基類析構函式加不加virtual,只要是宣告的是派生類的指標,並且實際指向的例項是派生類的,會先呼叫派生類的析構方法,然後級聯呼叫父類的析構方法。3.析構函式做最後的...

學習子類的構造和析構順序

1 建構函式不能是虛函式 2 當析構函式不是虛函式時 父指標子物件時 構造是父 子,析構是父 3 當析構函式不是虛函式時 子指標子物件時 構造是父 子,析構是子 父 4 當析構函式是虛函式時 父指標子物件時 構造是父 子,析構是子 父 5 構造和析構函式中的虛函式都不能觸發多型行為。1 includ...