(1)當基類中沒有自己編寫的建構函式時,衍生類別預設條用基類的建構函式
(2)當基類中有自己編寫的建構函式時,要在基類中添加無參的建構函式
(3)在基類中有自己編寫的建構函式並且在基類中沒有添加無參的建構函式時,要在衍生類別中是用Base指定基類的建構函式
註: 初始化的順序是從基類到衍生類別。初始化時首先會調用基類的建構函式初始化基類,然後調用衍生類別的建構函式初始化衍生類別。
下邊內容是對C++的派生和繼承的描述,供參考
派生和繼承
1.衍生類別的概念
以物件導向的程式設計的觀點來看,繼承表達的是對象類之間的相互關係。這種關係使得某類對象可以繼承另外一類對象
的特徵和能力。如果一類對象繼承了另一類對象的特徵和能力,這個類就叫做所繼承類的衍生類別。
1.1聲明一個衍生類別的一般格式是:
class 衍生類別名:派生方式( public or private)基類名{
//衍生類別新增加或修改的資料和成員函數};
1.2衍生類別建構函式和解構函式的執行順序
當衍生類別中不含對象成員時
●在建立衍生類別對象時,建構函式的執行順序是:基類的建構函式→衍生類別的建構函式;
●在撤消衍生類別對象時,解構函式的執行順序是:衍生類別的建構函式→基類的建構函式。
當衍生類別中含有對象成員時
●在定義衍生類別對象時,建構函式的執行順序:基類的建構函式→對象成員的建構函式→衍生類別的建構函式;
●在撤消衍生類別對象時,解構函式的執行順序:衍生類別的建構函式→對象成員的建構函式→基類的建構函式。.
1.3衍生類別建構函式和解構函式的構造規則
當基類中無顯式定義建構函式或有函數但無參數時衍生類別可以不向基類傳遞參數,甚至可以不定義建構函式;
當基類中有建構函式且含有參數時,衍生類別必須定義建構函式以提供把參數傳遞給基類建構函式的途徑。
⑴衍生類別建構函式的一般格式為:
衍生類別::衍生類別建構函式名(參數表):基類建構函式名(參數表){
// 衍生類別新增成員
}
⑵當衍生類別中含有對象成員時,其建構函式的一般形式為:
衍生類別::衍生類別建構函式名(參數表):基類建構函式名(參數表),對象成員名(參數表),……對象成員名n(參數
表)
{//新增資料初始化(不包括對象成員)
}
2.多重繼承
前面我們介紹的衍生類別只有一個基類,稱為單基派生或單一繼承。在實際運用中,我們經常需要衍生類別同時具有多個基類
,這種方法稱為多基派生或多重繼承。
2.1多重繼承的聲明:
在C++中,聲明具有兩個以上基類的衍生類別與聲明單基衍生類別的形式類似,只需將要繼承的多個基類用逗號分開即可。
在多重繼承中,公有派生和私人派生對於基類成員在衍生類別的可訪問性與單繼承的規則相同。
另外,對基類成員的訪問必須是無二義的,若兩個基類中具有同名的資料成員或成員函數,使用成員名限定來消除二義性
,若衍生類別中新增成員或成員函數與基類成員或成員函數同名,則衍生類別會覆蓋外層同名成員,也須使用範圍分辨符。
2.2多重繼承的建構函式和解構函式:
多重繼承的建構函式的定義形式與單繼承建構函式的定義形式類似,只有n個基類的建構函式之間用“,”分隔。
多重繼承的建構函式的執行順序與單繼承建構函式的執行順序相同,也是遵循先執行基類的建構函式,再執行對象成員的
建構函式,最後執行衍生類別建構函式的原則。在多個基類之間,則嚴格按照衍生類別聲明是從左至右的順序來排列先後。而析構函
數的執行順序與建構函式的執行順序相反。
2.3虛基類:
如果某個衍生類別的部分或全部直接基類是從另一個共同的基類派生而來,在這些基類中,從上一級基類繼承來的成員就有
相同的名稱,則在這個衍生類別中訪問這個共同的基類中的成員時,可能會產生二義性,此時,可定義虛基類。這就要求在其直接
基類的定義中,使用關鍵字virtual將那個共同的基類定義為虛基類,其文法形式如下:
class 衍生類別名: virtual 派生方式 基類
虛基類的初始化與一般的多重繼承的初始化在文法上是一樣的 ,但建構函式的調用順序不同,虛基類建構函式的調用順序
是這樣規定的:
1)在同一層次中,先調用虛基類的建構函式,接下來依次是非虛基類的建構函式,對象成員的建構函式,衍生類別的構造函
數。
2)若同一層次中包含多個虛基類,這些虛基類的建構函式按對他們說明的先後次序調用
3)若虛基類由非虛基類派生而來,則仍然先調用基類建構函式,再調用衍生類別建構函式。
3.注意
1.基類向衍生類別提供它的行為和結構,衍生類別負責正確初始化基類對象
2.要用正確的參數調用直接基類的建構函式,以作為每個衍生類別建構函式的一部分(討論)
3.普通成員函數不能用這種文法調用基類方法
4.類只負責其直接基類的構造。但存在虛基類時有所不同
5.衍生類別建構函式的參數要包括自己使用的和基類需要使用的所用參數
6.衍生類別繼承基類的行為和結構,但不繼承建構函式和解構函式
7.要在衍生類別拷貝建構函式中調用基類的拷貝建構函式
8.要在衍生類別賦值運算子中調用基類的賦值運算子
9. 衍生類別解構函式並不明確調用基類的解構函式
10. 所用虛基類都由最後的衍生類別的建構函式所初始化。當建立對象時,將忽略子物件建構函式內部對虛基類建構函式的
調用。
11.公有繼承是繼承的主要模式,私人繼承只在特殊情況下用(如實現堆棧類可從列表類中繼承,但它不是某種列表,重新
匯出私人基類的成員。)私人繼承沒有多態性。
12.在單一繼承能實現目的時,不要用多重繼承
13.繼承的優點:代碼重用,在正在啟動並執行程式中加入新類和新功能(如衛星、病人監護),動態聯編,多態性。