派生類的建構函式
預設情況下基類的建構函式不被繼承,派生類需要定義自己的建構函式,但是C++11規定:可用using語句繼承基類建構函式,只不過只能初始化從基類繼承的成員。派生類新增成員可以通過類內初始值進行初始化。語法形式為: using B::B;
綜上所述在一般編寫程式時建議:
如果派生類有自己新增的成員,且需要通過建構函式初始化,則派生類要自定義建構函式。
若不繼承基類的建構函式
派生類新增成員:派生類定義建構函式初始化;
繼承來的成員:自動呼叫基類建構函式進行初始化;
派生類的建構函式需要給基類的建構函式傳遞引數。
單繼承
派生類只有一個直接基類的情況,是單繼承。單繼承時,派生類的建構函式只需要給一個直接基類建構函式傳遞引數。
單繼承時建構函式的定義語法:
派生類名::派生類名(基類所需的形參,本類成員所需的形參):
基類名(引數表), 本類成員初始化列表
{
//其他初始化;
};
多繼承
多繼承時,有多個直接基類,如果不繼承基類的建構函式,派生類建構函式需要給所有基類建構函式傳遞引數。我們來看一下語法規定:
派生類名::派生類名(引數表) :
基類名1(基類1初始化引數表),
基類名2(基類2初始化引數表),
…
基類名n(基類n初始化引數表),
本類成員初始化列表
{
//其他初始化;
};
派生類與基類的建構函式
當基類有預設建構函式時:
派生類建構函式可以不向基類建構函式傳遞引數。
構造派生類的物件時,基類的預設建構函式將被呼叫。
如需執行基類中帶引數的建構函式:
派生類建構函式應為基類建構函式提供引數。
多繼承且有物件成員
派生類名::派生類名(形參表):
基類名1(引數), 基類名2(引數), …, 基類名n(引數),
本類成員(含物件成員)初始化列表
{
//其他初始化
};
建構函式的執行順序
1)呼叫基類建構函式。
順序按照它們被繼承時宣告的順序(從左向右)。
2)對初始化列表中的成員進行初始化。
順序按照它們在類中定義的順序。
物件成員初始化時自動呼叫其所屬類的建構函式。由初始化列表提供引數。
3)執行派生類的建構函式體中的內容。
訪問從基類繼承的成員
1)當派生類與基類中有相同成員時:
若未特別限定,則通過派生類物件使用的是派生類中的同名成員。
如要通過派生類物件訪問基類中被隱藏的同名成員,應使用基類名和作用域操作符(::)來限定。
2)二義性問題:
如果從不同基類繼承了同名成員,但是在派生類中沒有定義同名成員,“派生類物件名或引用名.成員名”、“派生類指標->成員名”訪問成員存在二義性問題。
解決方式:用類名限定。