c 中單繼承建構函式與析構函式的呼叫順序

2021-10-08 21:29:46 字數 1632 閱讀 3764

在c++的單繼承中,建構函式有3個需要呼叫的地方

基類建構函式

子物件建構函式

派生類本身的建構函式

呼叫的順序為:

呼叫基類建構函式,對基類資料成員初始化

呼叫子物件建構函式,對子物件資料成員初始化

呼叫派生類建構函式,對派生類資料成員初始化

基類和派生類的建構函式相信不用多說了,前者優先於後者,需要注意的是這裡面的子物件的建構函式。

注意:在每乙個類中,不管他是基類還是派生類,子物件的建構函式的呼叫都優先於此類本身的構造函式呼叫

只要搞清楚了建構函式的順序,一但遇到了析構函式,只要把建構函式反過來看,就是析構函式的呼叫順序了。

實驗**如下:

#include

using

namespace std;

class

d// 實驗的子物件類~d

()};

class

e// 實驗的子物件類~e

()};

classa~

a()//d d;

//e e;};

classb:

public a~b

()//d d;

//e e;};

classc:

public b~c

()d d;

e e;};

intmain()

執行結果如下:

注意:在每個類中,如果有多個子物件,那麼他們建構函式的呼叫順序取決於他們的宣告順序,宣告越早,構造越早。如上面**中在類c中子物件d, e的構造函式呼叫,因為d的宣告在e之前,所以的d的建構函式先呼叫

現在將兩個子物件放到類b中

#include

using

namespace std;

classd~

d()}

;classe~

e()}

;classa~

a()//d d;

//e e;};

classb:

public a~b

()d d;

e e;};

classc:

public b~c

()//d d;

//e e;};

intmain()

執行結果如下:

下面將子物件放到類a中:

#include

using

namespace std;

classd~

d()}

;classe~

e()}

;classa~

a() d d;

e e;};

classb:

public a~b

()//d d;

//e e;};

classc:

public b~c

()//d d;

//e e;};

intmain()

執行結果如下:

繼承中建構函式與析構函式

include using namespace std class y y int ii i ii class x public y 這個是繼承,在繼承的時候,x 類中含有的函式與y 函式相同,則將y類的此函式遮蔽掉,無論引數是否相同,只要函式一樣就將其遮蔽掉,class base1 base1 c...

C 繼承中的建構函式和析構函式

1 繼承中建構函式和析構函式呼叫順序 a 呼叫父類建構函式 b 呼叫其他成員的建構函式 c 呼叫子類建構函式 d 析構呼叫順序相反。include using namespace std class base public base cout base中的預設構造函式呼叫 2 子類預設呼叫父類的預設...

C 中建構函式與析構函式

建構函式主要功能 在建立物件的時候,給物件變數賦值。析構函式主要功能 當物件脫離其作用域時 例如物件所在的函式已呼叫完畢 系統自動執行析構函式,在此物件撤銷的時候釋放所占用的資源 在建立乙個類的物件時,首先呼叫建構函式對這個物件進行初始化。當這個物件的生命週期結束時,呼叫析構函式。例如,定義了乙個類...