派生類的建構函式

2021-06-22 20:08:03 字數 2578 閱讀 8684

1.派生類的概念

以物件導向的程式設計的觀點來看,繼承表達的是物件類之間的相互關係。這種關係使得某類物件可以繼承另外一類物件的特徵和能力。如果一類物件繼承了另一類物件的特徵和能力,這個類就叫做所繼承類的派生類。

1.1宣告乙個派生類的一般格式是:

class 派生類名:派生方式( public or private)基類名;

1.2派生類建構函式和析構函式的執行順序

當派生類中不含物件成員時

●在建立派生類物件時,建構函式的執行順序是:基類的建構函式→派生類的建構函式;

●在撤消派生類物件時,析構函式的執行順序是:派生類的建構函式→基類的建構函式。

當派生類中含有物件成員時(這裡的物件成員是

指類的物件嗎

?比如string,vector等)

●在定義派生類物件時,建構函式的執行順序:基類的建構函式→物件成員的建構函式→派生類的建構函式;(

總是先建立基類

)●在撤消派生類物件時,析構函式的執行順序:派生類的建構函式→物件成員的建構函式→基類的建構函式。.

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.繼承的優點:**重用,在正在執行的程式中加入新類和新功能(如衛星、病人監護),動態聯編,多型性。

派生類建構函式

1 建構函式和複製控制成員不能繼承,每個類定義自己的建構函式和複製控制成員。像任何類一樣,如果類不定義自己的預設建構函式和複製控制成員,就將使用合成版本。2 派生類的合成預設建構函式除了初始化派生類的資料成員之外,它還初始化派生類物件的基類部分。基類部分由基類的預設建構函式初始化。3 派生類建構函式...

派生類 建構函式

在hpp標頭檔案中,宣告建構函式中,必須為新增的資料成員和基類的資料成員提供資料,即每乙個形參代表乙個成員 派生類宣告建構函式入下,其中r是給新增的資料,後面是基類的成員。在cpp檔案定義的時候,必須建立基類的物件,即如果不是預設的物件,則必須顯示的建立基類的物件,將資料傳遞給基類的物件 如下圖 t...

派生類的建構函式

派生類的資料成員由所有基類的資料成員與派生類新增的資料成員共同組成,如果派生類新增成員中包括其他類的物件 子物件 派生類的資料成員中實際上還間接包括了這些物件的資料成員。因此,構造派生類的物件時,必須對基類資料成員 新增資料成員和成員物件的資料成員進行初始化。派生類的建構函式必須要以合適的初值作為引...