關於C 中派生類呼叫基類建構函式的理解

2021-09-30 05:17:53 字數 2663 閱讀 2712

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

關於C 中派生類呼叫基類建構函式的理解

1 當基類中沒有自己編寫的建構函式時,派生類預設條用基類的建構函式 2 當基類中有自己編寫的建構函式時,要在基類中新增無參的建構函式 3 在基類中有自己編寫的建構函式並且在基類中沒有新增無參的建構函式時,要在派生類中是用base指定基類的建構函式 注 初始化的順序是從基類到派生類。初始化時首先會呼叫...

關於C 中派生類呼叫基類建構函式的理解

1 當基類中沒有自己編寫的建構函式時,派生類預設條用基類的建構函式 2 當基類中有自己編寫的建構函式時,要在基類中新增無參的建構函式 public class mybaseclass public mybaseclass int i public class myderivedclass mybas...

C 中派生類建構函式解析

簡單的繼承方式 class parent class son public parent 上面的 完成了下面的工作 派生類物件儲存了基類的資料成員 派生類繼承了基類的實現 派生類物件可以使用基類的方法 派生類繼承了基類的介面 派生類需要進行下面的工作 需要自己的建構函式 可 以根據需要新增額外的資料...