c 基類與派生類的構造與析構順序

2022-09-11 20:54:20 字數 965 閱讀 4107

昨天做了網易的實習生筆試(一首涼涼送給自己),其中有道問答題是這樣的

1 #include2

using

namespace

std;

3classa4

7 ~a()89

};10

11class b : publica12

15 b()

16 ~b()

17private:18

a _a;

19};

2021

intmain()

22

指出基類建構函式、派生類建構函式,派生類成員變數建構函式的呼叫順序,並出他們的析構函式呼叫順序。

**執行結果如下:

首先是類a的例項a,輸出第一行的「a」;因為b是a的派生類,b在例項化時會先呼叫a的建構函式,然後呼叫自己的建構函式(見鏈結

),所以其次輸出第二行「a」和第三行「b」。

然後是b的析構,先呼叫派生類(自己)的析構函式,將成員變數_a析構然後呼叫父類的析構函式,這對應第

四、第五和第六行的輸出。第七行為a的析構。

這時候問題就來了,為什麼b的成員變數_a在初始化的時候沒有呼叫a的建構函式?

原來是因為在初始化_a的時候使用了初始化列表,此時會呼叫a的拷貝建構函式(當我們沒有定義拷貝建構函式時,編譯器會為我們定義乙個),故沒有輸出「a」。

若我們顯示的定義乙個拷貝建構函式:

1

classa2

5 a(const a &a)

6 ~a()

78 };

結果如下:

C 基類和派生類構造和析構函式的順序!

在visual studio中,新建控制台工程,構造類如下 include using namespace std class cbase cbase class cderive public cbase cderive 對應不同的指標進行 delete 操作,結果如下 i int main int...

基類和派生類析構函式執行順序

下面是自己實驗結果 沒有宣告虛函式時 include using namespace std class base base class derived public base derived int main 輸出 base contruction derived contruction 1 ba...

派生類的建構函式與析構函式

派生類的建構函式的定義形式為 派生類名 派生類名 引數總表 基類名1 引數名錶1 基類名2 引數名錶2 基類名n 引數名錶n 成員物件名1 成員物件引數名錶1 成員物件名m 成員物件引數名錶m 所列出的成員物件名全部為新增成員物件的名字 本例只是為了演示派生類的定義與使用,盡可能顧及最常用的各方面。...