溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

C++類繼承時的構(gòu)造函數(shù)實例分析

發(fā)布時間:2022-03-10 09:06:30 來源:億速云 閱讀:156 作者:iii 欄目:開發(fā)技術(shù)

這篇“C++類繼承時的構(gòu)造函數(shù)實例分析”文章的知識點大部分人都不太理解,所以小編給大家總結(jié)了以下內(nèi)容,內(nèi)容詳細(xì),步驟清晰,具有一定的借鑒價值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來看看這篇“C++類繼承時的構(gòu)造函數(shù)實例分析”文章吧。

前言:

子類需要編寫自己的構(gòu)造函數(shù)和析構(gòu)函數(shù),需要注意的是,子類只負(fù)責(zé)對新增的成員進(jìn)行初始化和掃尾編寫構(gòu)造和析構(gòu)函數(shù),父類成員的初始化和掃尾工作由父類的構(gòu)造函數(shù)和析構(gòu)函數(shù)完成。

無論何種類型的繼承方式,子類都無權(quán)訪問父類的所有成員,所以子類對父類的初始化需要父類的構(gòu)造函數(shù)完成。此時,子類的構(gòu)造函數(shù)必須提供父類構(gòu)造函數(shù)所需的參數(shù)。

子類構(gòu)造函數(shù)的語法如下:

子類::子類(全部參數(shù)表):父類1(父類1參數(shù)表),父類2(父類2參數(shù)表)
      ...對象成員1(對象成員1參數(shù)表),對象成員2(對象成員2參數(shù)表)

其中,“全部參數(shù)表”中包含“所有父類所需參數(shù)”和“子類新增成員所需參數(shù)”;對象成員表示子類新增的對象成員(某些外部類的對象作為子類成員)。

必須指出,子類首先調(diào)用父類的構(gòu)造函數(shù),然后才調(diào)用自身的構(gòu)造函數(shù);如果子類含有多個構(gòu)造函數(shù),那么按照子類繼承各個父類時的聲明順序,來調(diào)用各個父類的構(gòu)造函數(shù)。

下面定義了X、Y和Z三個類,然后Point類繼承這三個類:

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類沒有對象成員),并以初始化列表的方式對各個父類進(jìn)行初始化。下面定義Point類對象,

來查看子類和父類構(gòu)造函數(shù)的調(diào)用順序:

int main() {
    Point p(333, 666, 999);
}
// 得到下面的結(jié)果
init X 333
init Y 666
init Z
init Point 999

再次證明:因為Point聲明時先繼承X類后繼承Y類,所以先調(diào)用X構(gòu)造函數(shù)后調(diào)用Y構(gòu)造函數(shù),最后調(diào)用Z類構(gòu)造函數(shù)。

此外,某個父類構(gòu)造函數(shù)不需要參數(shù)時,子類構(gòu)造函數(shù)可以不考慮此父類,系統(tǒng)會調(diào)用該父類默認(rèn)的構(gòu)造函數(shù)(比如上述的Z類)。如果某個父類即含有需要參數(shù)的構(gòu)造函數(shù),又含有不需參數(shù)的構(gòu)造函數(shù),程序員可自行決定使用哪一個。

通過總結(jié)可以得出,子類構(gòu)造函數(shù)代碼運(yùn)行次序如下:

  • 首先,按照父類在繼承聲明時的次序調(diào)用對應(yīng)構(gòu)造函數(shù);

  • 其次,按照子類的對象成員在子類中聲明次序?qū)ζ溥M(jìn)行初始化;

  • 最后,執(zhí)行子類構(gòu)造函數(shù)體;

以上就是關(guān)于“C++類繼承時的構(gòu)造函數(shù)實例分析”這篇文章的內(nèi)容,相信大家都有了一定的了解,希望小編分享的內(nèi)容對大家有幫助,若想了解更多相關(guān)的知識內(nèi)容,請關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

c++
AI