派生類的目的是為了發展,派生類繼承了積累的成員,實現了原有**的重用,這只是一部分
,而**的擴充才是最主要的,只有通過新增新的成員,加入新的功能,類的派生才有實際意義。
派生類的建構函式只負責對新增的成員進行初始化,對所有從基類
繼承來的成員,其初始化工作還是由基類的建構函式完成。同樣,對派生類物件的掃尾、清理工作,也需要加入新的的析構函式。
基類的建構函式並沒有繼承下來,要完成這些工作,就必須給派生類新增新的建構函式。派生類的建構函式需要以合適的初值作為引數,其中一些引數要用於對派生類新增成員進行初始化,另一些引數要分別傳遞給基類的建構函式和物件成員的建構函式,用於初始化相應的成員。
《什麼時候需要宣告派生類的建構函式?》
如果基類宣告了帶有形參表的建構函式時,派生類就應當宣告建構函式,提供乙個將引數傳遞給基類建構函式的途徑,保證在基類進行初始化時能夠獲得必要的資料。當然,如果積累沒有宣告建構函式,派生類也可以不宣告建構函式,全部採用預設建構函式,這時新增成員的初始化工作可以用其他公有函式來完成。
派生類建構函式執行的一般次序如下:
(1) 呼叫基類建構函式,呼叫順序按照它們被繼承時的順序(從左至右)
(2) 呼叫內嵌成員物件的建構函式,呼叫順序按照它們在類中宣告的順序
(3) 派生類建構函式體中的內容
其中,如果派生類中新增成員中有內嵌的物件,第二部呼叫才會執行,否則,就直接跳轉到第三步。
示例:#include
usingnamespacestd;
class b1
;class b2
;class b3
;class c:public b2,public b1,public b3 //派生類c,注意此處的繼承順序!
//注意基類名的個數與順序
//注意成員物件名的個數與順序
//memberb2和memberb1為內嵌物件
private:
b1memberb1;
b2memberb2;
b3memberb3;
};intmain()
注意:首先,這裡並沒有列出全部的基類和成員物件,由於b3類只有預設建構函式,不需要給它傳遞引數,
因此,基類b3以及b3類成員物件memberb3就不必列出。
其次,基類名和成員物件名的順序是隨意的。
這個派生類建構函式的函式體為空,可見實際上只是起到了傳遞引數和呼叫基類及內嵌物件建構函式的作用。
輸出:
基類建構函式的呼叫順序是按照派生類定義時的順序,因此應該是先b2,再b1,再b3,而內嵌物件
的構造函式呼叫順序應該是按照成員在類中宣告的順序,應該是先b1,再b2,再b3,程式執行的結果也完全印證這種分析。
《拷貝建構函式》
如果要為派生類編寫拷貝建構函式,則需要為基類相應的拷貝建構函式傳遞引數。例如假設c類是b類的派生類,c類的拷貝建構函式形式如下:
c::c(c &c1):b(c1)
b類的拷貝構造函式引數型別應該是b類物件的引用,為什麼要用c類物件的引用c1作為引數呢?
這是因為型別相容規則在這裡起到了作用:可以用派生類的引用去初始化基類的引用。因此當函式的形參是基類的引用時,實參可以是派生類的引用。
《析構函式》
執行次序和建構函式正好嚴格相反。
示例:#include
usingnamespacestd;
class b1
;class b2
;class b3
;classc:publicb2,publicb1,publicb3 //派生類c,注意此處的繼承順序!
//注意基類名的個數與順序
//注意成員物件名的個數與順序
private:
b1memberb1;
b2memberb2;
b3memberb3;
};intmain()
執行結果:
派生類的建構函式和析構函式
c 學習筆記和總結 這段時間看了c 中類的繼承和派生,這應該算是c 和c語言相比最主要的乙個知識點了。不得不說類的功能是十分強大的,它定義了public,protected,private三種訪問內部成員的訪問許可權,增加了程式的安全性和保護性。通過定義類的物件可以訪問類的成員,但是定義物件是外部訪...
派生類的建構函式和析構函式
一.簡單派生類的析構函式和建構函式。1.簡單派生類建構函式的定義形式 派生類建構函式名 總參數列列 基類建構函式名 參數列列 其中,總參數列列中的引數包括派生類引數和基類引數,且基類引數放在最前面。參數列列裡中只有引數名,沒有引數型別。2.注意簡單派生類建構函式的定義形式中,中間有乙個冒號。3.參數...
派生類建構函式和析構函式的構造規則
先給出程式 includeusing namespace std class first first int x,int y first void show 此時,系統自動呼叫基類的無參建構函式 若類沒有無參建構函式,則呼叫預設的建構函式 也可以顯式的指出具體呼叫基類的哪乙個建構函式,例如 thir...