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

2022-07-08 22:30:13 字數 3424 閱讀 7812

今天收到盛大的面試,問我乙個問題,關於派生類中如何初始化基類物件,我在想派生類對於建構函式不都是先構造基類物件,然後在構造子類物件,但是如果我們在成員初始化列表先初始化派生類的私有成員,在函式內去呼叫基類的建構函式,能編譯通過嗎?或者當我們定義了基類的預設建構函式,而沒有去在派生類的建構函式中顯示的去呼叫基類的建構函式,會出現什麼狀況,我想派生類肯定會自動去呼叫基類的預設建構函式,那麼析構函式又怎麼樣呢?我們都知道派生類的析構函式會先被呼叫,然後基類的析構函式後被呼叫,但是我不知道我們是否需要在派生類的析構函式中顯示的去呼叫基類的析構函式嗎?這個有待我去驗證。

**一:在派生類中成員初始化列表先初始化派生類的私有成員,不顯示的呼叫基類的建構函式

#include using

namespace

std;

class

base

~base(){}

};class derive:public

base

~derive(){}

};int

main()

結果:編譯錯誤,error c2512: 「base」: 沒有合適的預設建構函式可用

**二:在派生類中成員初始化列表先初始化派生類的私有成員,顯示的呼叫基類的建構函式

#include using

namespace

std;

class

base

base(

int m):n(m)

~base(){}

};class derive:public

base

~derive(){}

};int

main()

執行結果:

**三:在派生類中成員初始化列表先初始化派生類的私有成員,不顯示的呼叫基類的建構函式,則會呼叫預設的建構函式

#include using

namespace

std;

class

base

base(

int m):n(m)

~base(){}

};class derive:public

base

~derive(){}

};int

main()

執行結果:

**四:派生類析構函式的呼叫過程中會不會自動去呼叫基類的析構函式呢?答案是,肯定的,所以千萬不要在派生類的析構函式中再去呼叫基類的析構函式,這種去釋放已經釋放的記憶體,系統是不允許的。

#include using

namespace

std;

class

base

base(

int m):n(m)

~base()

};class derive:public

base

~derive()

};int

main()

執行結果:

**5:如果我們去試試在派生類的析構函式中去呼叫基類的析構函式,看看結果如何?當我想這麼做的時候,我突然發現這個**我寫出來,因為我們都知道,對於c++的乙個物件要麼將物件分配在棧中,要麼將物件分配在堆中,而對於分配在棧中的物件我們過程結束後,自動呼叫類的析構函式,而分配在堆中的物件,得我們去delete,但是你必須拿到指向物件在堆中記憶體的控制代碼,也就是指標,但是我發現不可能拿得到,除非你在派生類的建構函式中去new基類物件,但是又有個問題,在派生類建構函式中去new出這個基類物件,那麼基類物件是派生類的區域性變數,還是派生類繼承而來的呢?我發現肯定是派生類的區域性變數,那麼也就是說,如果new出乙個派生類物件,那麼派生類本身的私有成員是在堆中,而繼承而來的屬性,也就是基類的東西分配的棧中,好吧,這樣,難道派生物件在記憶體上竟然不是連續的?

#include using

namespace

std;

class

base

base(

int m):n(m)

~base()

};class derive:public

base

~derive()

};int

main()

執行結果如下:

構造兩次基類,一次構造派生類中的基類成分,還有一次僅僅是派生類的變數而已。同時析構派生類,自動呼叫基類析構函式。

**六:在派生類建構函式中用new分配乙個基類物件,然後析構掉,在main函式中去呼叫基類的成員函式,發現仍可排程,說明在派生類建構函式中用new分配基類物件,不是派生類的基類成分。

#include using

namespace

std;

class

base

base(

int m):n(m)

void

get()

~base()

};class derive:public

base

~derive()

};int

main()

執行如下:

下面我就有乙個疑問了,派生類中只能將基類成分分配在棧中嗎?而如果去new出派生類物件,那麼豈不記憶體不連續了,這是個問題?我驗證了一下,與我的想法並非一致,記憶體還是連續的。只不過在派生類構造基類的過程中(new出派生類方式),只是在堆中去分配基類的成分,雖然使用非new來建立基類物件。

**如下:

#include using

namespace

std;

class

base

base(

int m):n(m)

void

get()

~base()

};class derive:public

base

~derive()

};int

main()

執行結果如下:

以上可以看出位址連續,說明派生類中基類成分和派生類成分位址是連續的。

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

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

C 基類和派生類賦值(初始化)規則 (記錄)

在公有派生的情況下,有以下三條賦值相容規則。上面三條反過來是不成立的。例如,不能把基類物件賦值給派生類物件。下面的程式能夠成功編譯,充分說明了上述三條規則。class a class b public a 公有派生 int main 將派生類物件賦值給基類物件 如上面程式中的a b 語句 在賦值號沒...

關於基類指標 派生類指標 基類物件派 生類物件問題

1 基類指向派生類的指標 2 派生類指向基類的指標 3 以及將派生類指標強制轉換為基類指標 4 將基類指標強制轉換為派生類指標 無論是基類指向派生類還是派生類指向基類,重點就是哪個類的指標就呼叫哪個類的方法,而輸出的是指標指向的物件。基類指向派生類的指標即將派生類物件賦給基類指標,如果輸出的話,呼叫...