C++ 類的繼承與派生(六)派生類的構(gòu)造和析構(gòu)函數(shù)

注意:本文中代碼均使用 Qt 開發(fā)編譯環(huán)境

派生類的目的是為了發(fā)展确封,派生類繼承了基類的成員,實現(xiàn)了原有代碼的重用,這只是一部分廊宪,而代碼的擴充才是最主要的,只有通過添加新的成員眉踱,加入新的功能挤忙,類的派生才有實際意義。

派生類的構(gòu)造函數(shù)只負責對新增的成員進行初始化谈喳,對所有從基類繼承來的成員级历,其初始化工作還是由基類的構(gòu)造函數(shù)完成初狰。同樣,對派生類對象的掃尾、清理工作慕趴,也需要加入新的的析構(gòu)函數(shù)。

基類的構(gòu)造函數(shù)并沒有繼承下來薪缆,要完成這些工作漾唉,就必須給派生類添加新的構(gòu)造函數(shù)。派生類的構(gòu)造函數(shù)需要以合適的初值作為參數(shù)膛壹,其中一些參數(shù)要用于對派生類新增成員進行初始化驾中,另一些參數(shù)要分別傳遞給基類的構(gòu)造函數(shù)和對象成員的構(gòu)造函數(shù),用于初始化相應的成員模聋。

什么時候需要聲明派生類的構(gòu)造函數(shù)肩民?###

如果基類聲明了帶有形參表的構(gòu)造函數(shù)時,派生類就應當聲明構(gòu)造函數(shù)链方,提供一個將參數(shù)傳遞給基類構(gòu)造函數(shù)的途徑持痰,保證在基類進行初始化時能夠獲得必要的數(shù)據(jù)。當然祟蚀,如果基類沒有聲明構(gòu)造函數(shù)工窍,派生類也可以不聲明構(gòu)造函數(shù)割卖,全部采用默認構(gòu)造函數(shù),這時新增成員的初始化工作可以用其他公有函數(shù)來完成患雏。

派生類構(gòu)造函數(shù)執(zhí)行的一般次序如下:
(1) 調(diào)用基類構(gòu)造函數(shù)鹏溯,調(diào)用順序按照它們被繼承時的順序(從左至右)
(2) 調(diào)用內(nèi)嵌成員對象的構(gòu)造函數(shù),調(diào)用順序按照它們在類中聲明的順序
(3) 派生類構(gòu)造函數(shù)體中的內(nèi)容

其中纵苛,如果派生類中新增成員中有內(nèi)嵌的對象剿涮,第二步調(diào)用才會執(zhí)行,否則攻人,就直接跳轉(zhuǎn)到第三步取试。

示例:

#include <QCoreApplication>
#include <QDebug>

class B1
{

public:
    B1(int i){qDebug()<<"Constructing B1 "<<i;}    //基類B1,構(gòu)造函數(shù)有參數(shù)
};

class B2
{

public:
    B2(int j){qDebug()<<"Constructing B2 "<<j;}    //基類B2怀吻,構(gòu)造函數(shù)有參數(shù)
};

class B3
{

public:
    B3(){qDebug()<<"Constructing B3 *";}    //基類B3瞬浓,構(gòu)造函數(shù)無參數(shù)
};

class C : public B2,public B1,public B3        //派生類C,注意此處的繼承順序蓬坡!
{

public:
    C(int a,int b, int c,int d):B1(a),memberB2(d),memberB1(c),B2(b){}

private:
    B1 memberB1;
    B2 memberB2;
    B3 memberB3;
};

int main()
{
    C obj(1,2,3,4);
    return 0;
}

注意:
首先猿棉,這里并沒有列出全部的基類和成員對象,由于B3類只有默認構(gòu)造函數(shù)屑咳,不需要給它傳遞參數(shù)萨赁,因此,基類B3以及B3類成員對象memberB3就不必列出兆龙。

其次杖爽,基類名和成員對象名的順序是隨意的。這個派生類構(gòu)造函數(shù)的函數(shù)體為空紫皇,可見實際上只是起到了傳遞參數(shù)和調(diào)用基類及內(nèi)嵌對象構(gòu)造函數(shù)的作用慰安。

輸出:


輸出結(jié)果

基類構(gòu)造函數(shù)的調(diào)用順序是按照派生類定義時的順序,因此應該是先B2聪铺,再B1化焕,再B3,而內(nèi)嵌對象的構(gòu)造函數(shù)調(diào)用順序應該是按照成員在類中聲明的順序铃剔,應該是先B1撒桨,再B2,再B3键兜,程序運行的結(jié)果也完全印證這種分析凤类。

拷貝構(gòu)造函數(shù)###

如果要為派生類編寫拷貝構(gòu)造函數(shù),則需要為基類相應的拷貝構(gòu)造函數(shù)傳遞參數(shù)蝶押。例如假設C類是B類的派生類踱蠢,C類的拷貝構(gòu)造函數(shù)形式如下:
C::C(C &c1):B(c1){…}

B類的拷貝構(gòu)造函數(shù)參數(shù)類型應該是B類對象的引用火欧,為什么要用C類對象的引用c1作為參數(shù)呢棋电?
這是因為類型兼容規(guī)則在這里起到了作用:可以用派生類的引用去初始化基類的引用茎截。因此當函數(shù)的形參是基類的引用時,實參可以是派生類的引用赶盔。

析構(gòu)函數(shù)###

從下面的實例輸出結(jié)果可以簡單的看出派生類析構(gòu)函數(shù)執(zhí)行次序和構(gòu)造函數(shù)正好嚴格相反企锌。

在上面的示例基礎上稍加調(diào)整:

#include <QCoreApplication>
#include <QDebug>

class B1
{

public:
    B1(int i){qDebug()<<"Constructing B1 "<<i;}    //基類B1,構(gòu)造函數(shù)有參數(shù)
    ~B1(){qDebug()<<"Destructing B1";}
};

class B2
{

public:
    B2(int j){qDebug()<<"Constructing B2 "<<j;}    //基類B2于未,構(gòu)造函數(shù)有參數(shù)
    ~B2(){qDebug()<<"Destructing B2";}
};

class B3
{

public:
    B3(){qDebug()<<"Constructing B3 *";}    //基類B3撕攒,構(gòu)造函數(shù)無參數(shù)
    ~B3(){qDebug()<<"Destructing B3";}
};

class C : public B2,public B1,public B3        //派生類C,注意此處的繼承順序烘浦!
{

public:
    C(int a,int b, int c,int d):B1(a),memberB2(d),memberB1(c),B2(b){}

private:
    B1 memberB1;
    B2 memberB2;
    B3 memberB3;
};

int main()
{
    C obj(1,2,3,4);
    return 0;
}

輸出結(jié)果:


輸出結(jié)果
最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末抖坪,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子闷叉,更是在濱河造成了極大的恐慌擦俐,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,627評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件握侧,死亡現(xiàn)場離奇詭異蚯瞧,居然都是意外死亡,警方通過查閱死者的電腦和手機品擎,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,180評論 3 399
  • 文/潘曉璐 我一進店門埋合,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人萄传,你說我怎么就攤上這事甚颂。” “怎么了盲再?”我有些...
    開封第一講書人閱讀 169,346評論 0 362
  • 文/不壞的土叔 我叫張陵西设,是天一觀的道長。 經(jīng)常有香客問我答朋,道長贷揽,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,097評論 1 300
  • 正文 為了忘掉前任梦碗,我火速辦了婚禮禽绪,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘洪规。我一直安慰自己印屁,他們只是感情好,可當我...
    茶點故事閱讀 69,100評論 6 398
  • 文/花漫 我一把揭開白布斩例。 她就那樣靜靜地躺著雄人,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上础钠,一...
    開封第一講書人閱讀 52,696評論 1 312
  • 那天恰力,我揣著相機與錄音,去河邊找鬼旗吁。 笑死踩萎,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的很钓。 我是一名探鬼主播香府,決...
    沈念sama閱讀 41,165評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼码倦!你這毒婦竟也來了企孩?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,108評論 0 277
  • 序言:老撾萬榮一對情侶失蹤袁稽,失蹤者是張志新(化名)和其女友劉穎柠硕,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體运提,經(jīng)...
    沈念sama閱讀 46,646評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡蝗柔,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,709評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了民泵。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片癣丧。...
    茶點故事閱讀 40,861評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖栈妆,靈堂內(nèi)的尸體忽然破棺而出胁编,到底是詐尸還是另有隱情,我是刑警寧澤鳞尔,帶...
    沈念sama閱讀 36,527評論 5 351
  • 正文 年R本政府宣布嬉橙,位于F島的核電站,受9級特大地震影響寥假,放射性物質(zhì)發(fā)生泄漏市框。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,196評論 3 336
  • 文/蒙蒙 一糕韧、第九天 我趴在偏房一處隱蔽的房頂上張望枫振。 院中可真熱鬧,春花似錦萤彩、人聲如沸粪滤。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,698評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽杖小。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間予权,已是汗流浹背县踢。 一陣腳步聲響...
    開封第一講書人閱讀 33,804評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留伟件,地道東北人。 一個月前我還...
    沈念sama閱讀 49,287評論 3 379
  • 正文 我出身青樓议经,卻偏偏與公主長得像斧账,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子煞肾,可洞房花燭夜當晚...
    茶點故事閱讀 45,860評論 2 361

推薦閱讀更多精彩內(nèi)容

  • 轉(zhuǎn):C++繼承中構(gòu)造函數(shù)籍救、析構(gòu)函數(shù)調(diào)用順序及虛析構(gòu)函數(shù) 1.構(gòu)造函數(shù) 大家都知道構(gòu)造函數(shù)里就可以調(diào)用成員變量习绢,而繼...
    資深小夏閱讀 681評論 0 0
  • C++文件 例:從文件income. in中讀入收入直到文件結(jié)束,并將收入和稅金輸出到文件tax. out蝙昙。 檢查...
    SeanC52111閱讀 2,799評論 0 3
  • 類的繼承與派生 類的繼承就是新類由已經(jīng)存在的類獲得已有特性闪萄,類的派生是由已經(jīng)存在的類產(chǎn)生新類的過程。已有類叫做基類...
    Mr希靈閱讀 616評論 0 1
  • 前言 把《C++ Primer》[https://book.douban.com/subject/25708312...
    尤汐Yogy閱讀 9,523評論 1 51
  • 臥槽睡不著 那就告誡自己一句話奇颠,先成為朋友败去,能聊到一起,玩到一起烈拒,再看其它吧圆裕。 接觸久了才能真正了解一個人。 別忘...
    waitbutwhy閱讀 371評論 0 0