一:繼承的建構函式
派生類,也就是子類,它繼承了基類,當然也就繼承了基類的資料成員,我們知道,生成乙個物件是要呼叫建構函式的,這裡的子類當然也不例外,而且有經典的同學肯定也會知道,生成乙個子類物件時,不僅會呼叫子類的建構函式,而且還會呼叫父類的建構函式。我們在這裡分析一下子類的建構函式的書寫規則問題。
(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 中對指標進行型別轉換,不會改...