c++ 子類構(gòu)造函數(shù)初始化及父類構(gòu)造初始化的使用
我們知道,構(gòu)造方法是用來(lái)初始化類對(duì)象的。如果在類中沒(méi)有顯式地聲明構(gòu)造函數(shù),那么編譯器會(huì)自動(dòng)創(chuàng)建一個(gè)默認(rèn)的構(gòu)造函數(shù);并且這個(gè)默認(rèn)的構(gòu)造函數(shù)僅僅在沒(méi)有顯式地聲明構(gòu)造函數(shù)的情況下才會(huì)被創(chuàng)建創(chuàng)建。
構(gòu)造函數(shù)與父類的其它成員(成員變量和成員方法)不同,它不能被子類繼承。因此,在創(chuàng)建子類對(duì)象時(shí),為了初始化從父類中繼承來(lái)的成員變量,編譯器需要調(diào)用其父類的構(gòu)造函數(shù)。如果子類的構(gòu)造函數(shù)沒(méi)有顯示地調(diào)用父類的構(gòu)造函數(shù),則默認(rèn)調(diào)用父類的無(wú)參構(gòu)造函數(shù),至于什么事顯式調(diào)用,在下面會(huì)詳細(xì)說(shuō)明!關(guān)于子類中構(gòu)造函數(shù)的構(gòu)造原則,總結(jié)如下,歡迎大家指導(dǎo)與批評(píng)。
1.父類沒(méi)有聲明構(gòu)造函數(shù)
(1)子類也沒(méi)有聲明自己的構(gòu)造函數(shù),則父類和子類均由編譯器生成默認(rèn)的構(gòu)造函數(shù)。
(2)子類中聲明了構(gòu)造函數(shù)(無(wú)參或者帶參),則子類的構(gòu)造函數(shù)可以寫成任何形式,不用顧忌父類的構(gòu)造函數(shù)。在創(chuàng)建子類對(duì)象時(shí),先調(diào)用父類默認(rèn)的構(gòu)造函數(shù)(編譯器自動(dòng)生成),再調(diào)用子類的構(gòu)造函數(shù)。
2.父類只聲明了無(wú)參構(gòu)造函數(shù)
如果子類的構(gòu)造函數(shù)沒(méi)有顯式地調(diào)用父類的構(gòu)造,則將會(huì)調(diào)用父類的無(wú)參構(gòu)造函數(shù)。也就是說(shuō),父類的無(wú)參構(gòu)造函數(shù)將會(huì)被隱式地調(diào)用。
3.父類只聲明了帶參構(gòu)造函數(shù)
在這種情況下,要特別注意。因?yàn)楦割愔挥袔⒌臉?gòu)造函數(shù),所以如果子類中的構(gòu)造函數(shù)沒(méi)有顯示地調(diào)用父類的帶參構(gòu)造函數(shù),則會(huì)報(bào)錯(cuò),所以必需顯示地調(diào)用。
關(guān)于構(gòu)造函數(shù)的顯示調(diào)用,參見(jiàn)下例。
class animal
{
protected: //成員變量,聲明為protected或者public,這里選擇protected
int height; //若聲明為private,則不能被子類繼承訪問(wèn),會(huì)報(bào)錯(cuò)
int weight;
public:
animal(int height,int weight) //帶參的構(gòu)造函數(shù)
{
this->height=height;
this->weight=weight;
cout<<"animal的帶參構(gòu)造函數(shù)被調(diào)用"<<endl;
}
virtual ~animal()
{
cout<<"animal的析構(gòu)函數(shù)被調(diào)用"<<endl;
}
};
//子類
class fish:public animal
{
public:
fish():animal(height,weight) //顯示調(diào)用父類的構(gòu)造函數(shù)
{
cout<<"fish的構(gòu)造函數(shù)被調(diào)用"<<endl;
}
virtual ~fish()
{
cout<<"fish的析構(gòu)函數(shù)被調(diào)用"<<endl;
}
};
在子類fish的構(gòu)造函數(shù)中,加上一個(gè)冒號(hào)(:),然后加上父類的帶參構(gòu)造函數(shù),這就是父類構(gòu)造函數(shù)的顯式調(diào)用。這樣,在子類的構(gòu)造函數(shù)被調(diào)用時(shí),系統(tǒng)就會(huì)去調(diào)用父類的帶參構(gòu)造函數(shù),從而實(shí)現(xiàn)初始化父類的成員變量。運(yùn)行結(jié)果如下:

注意:
如果父類只有帶參的構(gòu)造函數(shù),且該帶參的構(gòu)造函數(shù)的參數(shù)有默認(rèn)值,此時(shí)在子類中也可以不用顯示的調(diào)用父類的構(gòu)造函數(shù)。
// 父類的構(gòu)造函數(shù),改成帶有默認(rèn)值的參數(shù), 這樣在子類中就可以不用顯示調(diào)用了
animal(int height=19 ,int weight=20) //帶參的構(gòu)造函數(shù)
{
this->height=height;
this->weight=weight;
cout<<"animal的帶參構(gòu)造函數(shù)被調(diào)用"<<endl;
}
4.父類同時(shí)聲明了無(wú)參和帶參構(gòu)造函數(shù)
在這種情況下,子類只需要實(shí)現(xiàn)父類的一個(gè)構(gòu)造函數(shù)即可,不管是無(wú)參的還是帶參的構(gòu)造函數(shù)。如果子類的構(gòu)造函數(shù)沒(méi)有顯示地調(diào)用父類的構(gòu)造函數(shù)(無(wú)參或帶參),則默認(rèn)調(diào)用父類的無(wú)參構(gòu)造函數(shù)。
//父類
class animal
{
protected: //成員變量,聲明為protected或者public,這里選擇protected
int height; //若聲明為private,則不能被子類繼承訪問(wèn),會(huì)報(bào)錯(cuò)
int weight;
public:
animal()
{
height=0;
weight=0;
cout<<"animal的無(wú)參構(gòu)造函數(shù)被調(diào)用"<<endl;
}
animal(int height,int weight) //帶參的構(gòu)造函數(shù)
{
this->height=height;
this->weight=weight;
cout<<"animal的帶參構(gòu)造函數(shù)被調(diào)用"<<endl;
}
virtual ~animal()
{
cout<<"animal的析構(gòu)函數(shù)被調(diào)用"<<endl;
}
};
//子類
class fish:public animal
{
public:
fish() //沒(méi)有顯示地調(diào)用父類的構(gòu)造函數(shù)(無(wú)參或帶參),則默認(rèn)調(diào)用父類的無(wú)參構(gòu)造函數(shù)
{
cout<<"fish的構(gòu)造函數(shù)被調(diào)用"<<endl;
}
virtual ~fish()
{
cout<<"fish的析構(gòu)函數(shù)被調(diào)用"<<endl;
}
};
運(yùn)行結(jié)果如下:

總結(jié)以上幾條,可以歸納出C++中子類繼承父類時(shí)構(gòu)造函數(shù)的寫法的規(guī)律:當(dāng)父類有顯式地聲明了構(gòu)造函數(shù)時(shí),子類最低限度的實(shí)現(xiàn)父類中的一個(gè);當(dāng)父類沒(méi)有聲明構(gòu)造函數(shù)時(shí),子類可以不聲明構(gòu)造函數(shù)或者任意地書寫構(gòu)造函數(shù)。
到此這篇關(guān)于c++ 子類構(gòu)造函數(shù)初始化及父類構(gòu)造初始化的使用的文章就介紹到這了,更多相關(guān)c++ 子類構(gòu)造函數(shù)初始化及父類構(gòu)造初始化內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C語(yǔ)言編程中從密碼文件獲取數(shù)據(jù)的函數(shù)總結(jié)
這篇文章主要介紹了C語(yǔ)言編程中從密碼文件獲取數(shù)據(jù)的函數(shù)總結(jié),包括getpw()函數(shù)和getpwnam()函數(shù)以及getpwuid()函數(shù),需要的朋友可以參考下2015-08-08
C語(yǔ)言SQLite3事務(wù)和鎖的操作實(shí)例
這篇文章主要介紹了C語(yǔ)言SQLite3事務(wù)和鎖的操作,結(jié)合完整實(shí)例形式分析了C語(yǔ)言針對(duì)SQLite3數(shù)據(jù)庫(kù)的事務(wù)與鎖相關(guān)操作技巧,需要的朋友可以參考下2017-07-07
Qt實(shí)現(xiàn)http服務(wù)的示例代碼
這篇文章將為大家詳細(xì)講解有關(guān)Qt如何實(shí)現(xiàn)http服務(wù),小編覺(jué)得挺實(shí)用的,因此分享給大家做個(gè)參考,希望大家閱讀完這篇文章后可以有所收獲2023-04-04
C++實(shí)現(xiàn)Window環(huán)境聊天室功能
這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)Window環(huán)境聊天室功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-06-06
如何用C寫一個(gè)web服務(wù)器之GCC項(xiàng)目編譯
本文主要介紹了,如何用C寫一個(gè)web服務(wù)器,Linux下用GCC進(jìn)行項(xiàng)目編譯,對(duì)此感興趣的同學(xué),可以參考下。2021-05-05
C語(yǔ)言實(shí)現(xiàn)單鏈表的快速排序算法
大家好,本篇文章主要講的是C語(yǔ)言實(shí)現(xiàn)單鏈表的快速排序算法,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下2022-01-01
Qt物聯(lián)網(wǎng)管理平臺(tái)之實(shí)現(xiàn)數(shù)據(jù)查詢導(dǎo)出打印
這篇文章主要為大家介紹了如何利用Qt編寫物聯(lián)網(wǎng)管理平臺(tái)中數(shù)據(jù)查詢導(dǎo)出打印的功能,文字的示例代碼講解詳細(xì),感興趣的可以了解一下2022-07-07

