C++類和對象知識點整理五----派生類的構造函數和析構函數

22、C++派生類中的構造函數
a.基類的成員函數可以被繼承,可以通過派生類的對象訪問,但這僅僅指的是普通的成員函數,類的構造函數不能被繼承。


構造函數不能被繼承是有道理的,因爲即使繼承了,它的名字和派生類的名字也不一樣,不能成爲派生類的構造函數,當然更不能成爲普通的成員函數。


b.在設計派生類時,對繼承過來的成員變量的初始化工作也要由派生類的構造函數來完成,但是大部分基類都有private屬性的成員變量,他們在派生類中無法訪問,更不能用派生類的構造函數來初始化




這種矛盾在C++繼承中是普遍存在的,解決這個問題的思路是:在派生類的構造函數中調用基類的構造函數


c.構造函數的調用順序
基類構造函數總是被優先調用,這說明創建派生類對象時,會先調用基類的構造函數,在調用派生類的構造函數,如果繼承關係有好幾層的話,以此類推。


注意:派生類構造函數只能調用直接基類的構造函數,不能調用間接基類的。
因爲這樣做的話最原始的基類構造函數會被調用多次,相應的,初始化工作也會做多次,這不僅是多餘 的,還會浪費CPU時間以及內存,毫無益處。




事實上,通過派生類創建對象時必須要調用基類的構造函數,這是語法規定,換句話說,定義派生類構造函數時最好知名基類構造函數,如果不指明,就調用基類的默認構造函數(不帶參數的構造函數)如果沒有默認構造函數,那麼編譯失敗


23、C++派生類的析構函數
和構造函數類似,析構函數也不能被繼承,與構造函數不同的是,再派生類的析構函數中不用顯示調用基類的析構函數,因爲每個類職業一個析構函數,編譯器知道如何選擇,無需程序員干涉



b.析構函數的執行順序與構造函數的執行順序剛好相反


創建派生類對象時,構造函數的執行順序與繼承順序相同,即先執行基類構造函數,在執行派生類構造函數


而銷燬派生類對象時,析構函數的執行順序和繼承順序相反。























































發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章