一道關於C 派生類初始化的筆試題

2021-04-15 05:12:22 字數 836 閱讀 3705

最近看到這樣一道筆試題,偶學習整理了一下,不到之處,希望各位指正。

問題: 下列程式的輸出是什麼?

#include 

<

iostream

>

using namespace std;

classa ~

a() 

};classb ~

b() 

private

:a a;

};class

c: publica ~

c() 

private

:b b;

public

:a a;

};int

main() 

正確答案是:

下面是我的分析:

把握幾個原則:

1)父類首先被初始化,初始化順序與繼承順序相同。這裡c繼承a,所以要先初始化其父類a。

2)物件初始化時, 類成員變數的空間分配和初始化是在呼叫建構函式之前,無論是public的還是private的。

3)類成員變數的初始化順序是由它們的宣告順序決定的,無論是public還是private的。

4)物件析構時,變數釋放和析構函式的呼叫與初始化相反。

所以上面的列印結果分析如下:

a -- 父類class a 的建構函式列印出來

a -- 初始化class c的成員變數b b,b繼承a,所以再次呼叫a的建構函式列印

b -- class c的成員變數呼叫自己的建構函式列印

a -- 初始化class c的成員變數a a,a的建構函式列印

c --  最後才是c自己的建構函式列印

析構過程與上述順序相反。

派生類的初始化列表

說明派生類物件時,1 先呼叫各基類的建構函式 這裡分兩種情況 1.1 顯式地在初始化列表中呼叫基類的建構函式,如 b a int 這樣的話,就呼叫a的有參建構函式 1.2 沒有顯式呼叫,編譯器把基類的預設建構函式插入到初始化列表中,即b b a 2 再呼叫物件成員的建構函式 這裡分兩種情況 2.1 ...

C 派生類中如何初始化基類物件

今天收到盛大的面試,問我乙個問題,關於派生類中如何初始化基類物件,我在想派生類對於建構函式不都是先構造基類物件,然後在構造子類物件,但是如果我們在成員初始化列表先初始化派生類的私有成員,在函式內去呼叫基類的建構函式,能編譯通過嗎?或者當我們定義了基類的預設建構函式,而沒有去在派生類的建構函式中顯示的...

C 派生類中如何初始化基類物件

今天收到盛大的面試,問我乙個問題,關於派生類中如何初始化基類物件,我在想派生類對於建構函式不都是先構造基類物件,然後在構造子類物件,但是如果我們在成員初始化列表先初始化派生類的私有成員,在函式內去呼叫基類的建構函式,能編譯通過嗎?或者當我們定義了基類的預設建構函式,而沒有去在派生類的建構函式中顯示的...