派生類的構造和析構函數

因爲派生類不繼承基類的構造和析構函數,爲了對派生類新增的成員初始化,或掃尾、清理,需要加入構造和析構函數。

一、構造函數
派生類成員對象有所有基類的成員對象與派生類新增成員對象組成,在構造派生類的對象時,要對其所有成員對象初始化。

爲了完成這些工作必須添加新的構造函數,對新增加成員對象初始化,並通過調用基類構造函數,完成對不能直接訪問的基類成員對象初始化。

syntax:

派生類名::派生類名(參數表):基類名1(基類1初始化參數表),…,基類名n(基類n初始化參數表),成員對象名1(成員對象1初始化參數表),…,成員對象名m(成員對象m初始化參數表)
{
派生類構造函數其他操作;
}

參數表:給出初始化基類數據和新增加成員對象所需數據。

基類名1~n:
需要基於參數初始化(構造函數帶有形參表)的基類(對於使用默認構造函數的基類,可以不給出類名)

派生類構造函數執行次序
1)調用基類構造函數,順序按照繼承時聲明順序(from left to right);
2)對派生類新增成員對象初始化,按照類中聲明順序;
3)執行Function body。

二、複製構造函數
類似於構造函數,基類的複製構造函數也是不能被派生類繼承的

if不使用默認構造函數,則要爲派生類編寫複製構造函數,這個函數還要爲基類相應的複製構造函數傳遞參數。

syntax:
DerivedClassName : : DerivedClassName (DerivedClassName &v) : BaseClassName(v) ,…, { … }

雖然v爲派生類對象的引用,但根據類型兼容機制,依然可以用派生類的對象去初始化基類的引用。

三、析構函數
因派生類是不會繼承基類的析構函數的,那爲了對派生類新增的非對象成員清理,必須編寫派生類的析構函數,需要注意的是析構函數只要負責把派生類新增的非對象成員清理就好了,系統會調用基類的析構函數清理從基類繼承而來的成員。

清理工作順序:
1)執行派生類機構函數體;
2)清理派生類成員新增成員;
3)調用基類析構函數,清理從基類繼承而來的成員,清理順序與被繼承時聲明時的順序相反。

發佈了34 篇原創文章 · 獲贊 0 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章