繼承的建構函式,多重繼承,型別轉換與虛繼承

2021-10-10 04:02:07 字數 1911 閱讀 1605

一:繼承的建構函式

派生類,也就是子類,它繼承了基類,當然也就繼承了基類的資料成員,我們知道,生成乙個物件是要呼叫建構函式的,這裡的子類當然也不例外,而且有經典的同學肯定也會知道,生成乙個子類物件時,不僅會呼叫子類的建構函式,而且還會呼叫父類的建構函式。我們在這裡分析一下子類的建構函式的書寫規則問題。

(1)父類沒有帶引數的建構函式時,子類的建構函式書寫規則

#

include

using

namespace std;

classa}

;classb:

publica}

;int

main()

呼叫了a的建構函式和b的建構函式。

可以看到,生成乙個子類物件即會呼叫父類的建構函式,也會呼叫子類的建構函式,可以理解為,子類的建構函式負責初始化子類獨有的資料成員,父類的建構函式負責初始化,子類當中的父類部分的資料成員。這裡,父類沒有帶引數的建構函式,所以在子類的建構函式當中不需要顯示的呼叫父類的建構函式,這裡的話是系統幫我們呼叫了。

(2)父類有帶引數的建構函式時,子類的建構函式書寫規則

#

include

using

namespace std;

classaa

(int i,

int j)};

classb:

publica}

;int

main()

編譯器不會幫我們呼叫父類的建構函式了,需要我們手動呼叫。

(3)當父類有帶引數的建構函式時,並且子類有乙個類成員的變數時,子類的建構函式書寫規則

#

include

using

namespace std;

class

tmp}

;classa}

;classb:

public

a tmp obj;};

intmain()

上面當中,如果父類的構造函式引數非常多,那麼子類還要去手動呼叫是不是很麻煩,來看看c++11做出的改善。

#

include

using

namespace std;

classa}

;classb:

public

a */

//當然,如果我們自己寫建構函式,就需要手動呼叫父類的建構函式了

/*b(),,錯誤,沒有呼叫父類的建構函式

*/};int

main()

二:多重繼承

多重繼承的話,也就是說乙個派生類可以繼承多個類,這在實際程式設計當中用的不多,至於乙個類最多可以派生多少個基類,這一點cpp標準沒有明確給出。這裡的話主要看下多重繼承當中的二義性問題吧。

class

aint a;

static

int b;};

int a::b =10;

class

bint a;

static

int b;};

int b::b =10;

classc:

publica,

publicb}

;c a(1

);//std::cout << a.b <

對於a.b來說,,a不知道他訪問的b到底是繼承於類a還是類b,,當然,如果是類c自己定義了變數b,那麼就會把繼承過來的變數覆蓋,,這一點對於函式來說也是一樣的。

三:型別轉換

四:虛繼承

C 多重繼承下的指標型別轉換

在c 中,指標的型別轉換是經常發生的事情,比如將派生類指標轉換為基類指標,將基類指標轉換為派生類指標。指標的本質其實就是乙個整數,用以記錄程序虛擬記憶體空間中的位址編號,而指標的型別決定了編譯器對其指向的記憶體空間的解釋方式。基於上面的理解,我們似乎可以得出乙個結論,c 中對指標進行型別轉換,不會改...

C 多重繼承下的指標型別轉換

在c 中,指標的型別轉換是經常發生的事情,比如將派生類指標轉換為基類指標,將基類指標轉換為派生類指標。指標的本質其實就是乙個整數,用以記錄程序虛擬記憶體空間中的位址編號,而指標的型別決定了編譯器對其指向的記憶體空間的解釋方式。基於上面的理解,我們似乎可以得出乙個結論,c 中對指標進行型別轉換,不會改...

C 多重繼承下的指標型別轉換

在c 中,指標的型別轉換是經常發生的事情,比如將派生類指標轉換為基類指標,將基類指標轉換為派生類指標。指標的本質其實就是乙個整數,用以記錄程序虛擬記憶體空間中的位址編號,而指標的型別決定了編譯器對其指向的記憶體空間的解釋方式。基於上面的理解,我們似乎可以得出乙個結論,c 中對指標進行型別轉換,不會改...