子類被構造的時候回先呼叫父類的建構函式
子類析構的 時候先析構子類後析構父類
如果直接用子類構造乙個父類的物件,刪除這個父類的物件不會呼叫子類的析構函式(父類的析構函式為虛函式除外)
示例**:
//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...