C++類繼承時(shí)的構(gòu)造函數(shù)
前言:
子類需要編寫自己的構(gòu)造函數(shù)和析構(gòu)函數(shù),需要注意的是,子類只負(fù)責(zé)對(duì)新增的成員進(jìn)行初始化和掃尾編寫構(gòu)造和析構(gòu)函數(shù),父類成員的初始化和掃尾工作由父類的構(gòu)造函數(shù)和析構(gòu)函數(shù)完成。
無論何種類型的繼承方式,子類都無權(quán)訪問父類的所有成員,所以子類對(duì)父類的初始化需要父類的構(gòu)造函數(shù)完成。此時(shí),子類的構(gòu)造函數(shù)必須提供父類構(gòu)造函數(shù)所需的參數(shù)。
子類構(gòu)造函數(shù)的語法如下:
子類::子類(全部參數(shù)表):父類1(父類1參數(shù)表),父類2(父類2參數(shù)表)
...對(duì)象成員1(對(duì)象成員1參數(shù)表),對(duì)象成員2(對(duì)象成員2參數(shù)表)
其中,“全部參數(shù)表”中包含“所有父類所需參數(shù)”和“子類新增成員所需參數(shù)”;對(duì)象成員表示子類新增的對(duì)象成員(某些外部類的對(duì)象作為子類成員)。
必須指出,子類首先調(diào)用父類的構(gòu)造函數(shù),然后才調(diào)用自身的構(gòu)造函數(shù);如果子類含有多個(gè)構(gòu)造函數(shù),那么按照子類繼承各個(gè)父類時(shí)的聲明順序,來調(diào)用各個(gè)父類的構(gòu)造函數(shù)。
下面定義了X、Y和Z三個(gè)類,然后Point類繼承這三個(gè)類:
class X {
public:
?? ?X(int value) { printf("init X %d \n", value); }
};
class Y {
public:
?? ?Y(int value) { printf("init Y %d \n", value); }
};
class Z {
public:
?? ?Z() { printf("init Z \n"); }
};
class Point: public X, public Y , public z{
public:
?? ?Point(int value_x, int value_y, int value_point):X(value_x),Y(value_y) {
?? ??? ?printf("init Point %d \n", value_point);
?? ?}
};可以看出,Point類的構(gòu)造函數(shù)“全部參數(shù)表”中給出了“父類所需參數(shù)”和“本類成員所需參數(shù)”(此例中Point類沒有對(duì)象成員),并以初始化列表的方式對(duì)各個(gè)父類進(jìn)行初始化。下面定義Point類對(duì)象,
來查看子類和父類構(gòu)造函數(shù)的調(diào)用順序:
int main() {
?? ?Point p(333, 666, 999);
}
// 得到下面的結(jié)果
init X 333
init Y 666
init Z
init Point 999再次證明:因?yàn)?code>Point聲明時(shí)先繼承X類后繼承Y類,所以先調(diào)用X構(gòu)造函數(shù)后調(diào)用Y構(gòu)造函數(shù),最后調(diào)用Z類構(gòu)造函數(shù)。
此外,某個(gè)父類構(gòu)造函數(shù)不需要參數(shù)時(shí),子類構(gòu)造函數(shù)可以不考慮此父類,系統(tǒng)會(huì)調(diào)用該父類默認(rèn)的構(gòu)造函數(shù)(比如上述的Z類)。如果某個(gè)父類即含有需要參數(shù)的構(gòu)造函數(shù),又含有不需參數(shù)的構(gòu)造函數(shù),程序員可自行決定使用哪一個(gè)。
通過總結(jié)可以得出,子類構(gòu)造函數(shù)代碼運(yùn)行次序如下:
- 首先,按照父類在繼承聲明時(shí)的次序調(diào)用對(duì)應(yīng)構(gòu)造函數(shù);
- 其次,按照子類的對(duì)象成員在子類中聲明次序?qū)ζ溥M(jìn)行初始化;
- 最后,執(zhí)行子類構(gòu)造函數(shù)體;
到此這篇關(guān)于C++類繼承時(shí)的構(gòu)造函數(shù)的文章就介紹到這了,更多相關(guān)C++構(gòu)造函數(shù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
數(shù)據(jù)結(jié)構(gòu)之位圖(bitmap)詳解
這篇文章主要介紹了數(shù)據(jù)結(jié)構(gòu)之位圖詳解,本文講解了位圖的基本知識(shí)、位圖的實(shí)現(xiàn)方法、位圖的應(yīng)用等內(nèi)容,需要的朋友可以參考下2014-08-08
VS2019中CMake項(xiàng)目的簡(jiǎn)單使用方法
這篇文章主要介紹了VS2019中CMake項(xiàng)目的簡(jiǎn)單使用方法,需要的朋友可以參考下2020-02-02
C++實(shí)現(xiàn)LeetCode(36.驗(yàn)證數(shù)獨(dú))
這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(36.驗(yàn)證數(shù)獨(dú)),本篇文章通過簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07
C語言字符串函數(shù),字符函數(shù),內(nèi)存函數(shù)使用及模擬實(shí)現(xiàn)
這篇文章主要介紹了C語言字符串函數(shù),字符函數(shù),內(nèi)存函數(shù)使用及模擬實(shí)現(xiàn),文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-09-09

