派生類把基類繼承以後,怎麼樣通過派生類完成對基類成員進行初始化呢?一般默認情況下,基類的構造函數不被繼承,派生類需要定義自己的構造函數。一般情況下,通過派生類將參數傳遞給基類的構造函數,完成對基類的初始化,C++11規定,可以使用using語句繼承基類構造函數,但是隻能初始化從基類繼承的成員,語法形式:using B::B。
1. 派生類的構造函數
1.1 若不繼承基類的構造函數:
- 派生類新增成員:派生類定義構造含函數初始化;
- 繼承來的成員:自動調用基類構造函數進行初始化;
- 派生類的構造函數需要給積累的構造函數傳遞參數
1.2 單繼承時構造函數的定義語法:
派生類名::派生類名(基類所需的形參,本類成員所需的形參):
基類名(參數表),本類成員初始化列表
{
//其他初始化
};
1.3 多繼承時構造函數的定義語法:
派生類名::派生類名(參數表)
基類名1(基類1初始化參數表),
基類名2(基類2初始化參數表),
...
基類名n(基類n初始化參數表),
本類成員初始化列表
{
//其他初始化;
};
1.4 派生類與基類的構造函數
當基類有默認構造函數時
- 派生類構造函數可以不向基類構造函數傳遞參數
- 構造派生類的對象時,基類的默認構造函數將被調用
如需執行基類中帶參數的構造函數
- 派生類構造函數應爲基類構造函數提供參數
1.5 多繼承且有對象成員時派生的構造函數定義語法
派生類名::派生類名(形參表):
基類名1(參數),基類名2(參數),...,基類名n(參數),
本類成員(含對象成員)初始化列表
{
//其他初始化
};
1.6 構造函數的執行順序
- 調用基類構造函數:順序按照它們被繼承時聲明的順序(從左向右)
- 對初始化列表中的成員進行初始化:順序按照它們在類中定義的順序,對象成員初始化時自動調用其所屬類的構造函數,由初始化列表提供參數
- 執行派生類的構造函數體中的內容
2. 派生類的複製構造函數
若派生類沒有聲明覆制構造函數
- 編譯器會在需要時生成一個隱含的複製構造函數;
- 先調用基類的複製構造函數;
- 在爲派生類新增的成員執行復制。
若派生類定義了複製構造函數
- 一般都要爲基類的複製構造函數傳遞參數
- 複製構造函數只能接受一個參數,及用來初始化派生類定義的成員,也將被傳遞給基類的複製構造函數。
- 基類的複製構造函數形參類型是基類的對象的引用,實參可以是派生類對象的引用
- 例如:C::C(const C &c1):B(c1){...}
3. 派生類的析構函數
- 析構函數不被繼承,派生類如果需要,要自行聲明析構函數;
- 要聲明方法與無法繼承關係時類的析構函數相同;
- 不需要顯示地調用基類的析構函數,系統會自動隱式調用;
- 先執行派生類析構函數的函數體,在調用派生基類的析構函數。
4. 訪問從基類繼承的成員
當派生類與基類中有相同的成員時:
- 若未特別限定,則通過派生類對象使用的是派生類中同名成員。
- 如要通過派生類對象訪問基類中被隱藏的同名成員,應使用基類名和作用域操作符(::)來限定。