派生類物件初始化構造過程順序

2021-07-05 04:34:30 字數 1379 閱讀 7942

[cpp]view plain

copy

#include 

using

namespace

std;  

class

a   

};  

class

b: a   

};   

intmain(

void

)     

/*1.定義乙個派生類物件,首先初始化它的基類成員(基類部分)

即呼叫基類的建構函式(如果是多繼承,則按繼承的先後順序呼叫基類的建構函式)

2.基類部分初始化完之後,初始化派生類部分,派生類的成員初始化依賴它的宣告順序

並不依賴它的初始化列表的順序初始化派生類成員,總結來說:就是派生類成員的初始化

依賴它的宣告順序而不是依賴初始化列表的順序。

3.呼叫派生類的建構函式,可以理解為就是執行派生類建構函式的函式體而已

4.特別注意:但是,請注意:上面兩點呼叫建構函式或者其他的引數傳遞是參考初始化列表給出的引數的

詳細解釋:

首先:b z(1);則依據1,呼叫基類的建構函式,但是這裡不知道該呼叫基類的哪個建構函式

因為基類有預設的建構函式(即沒有引數)和你定義的a(int x)這個建構函式,所以,編譯器

要進行選擇。依據4,參考到初始化列表b(v),y(b+2),x(b+1),d(b),a(v)中有a(v),所以編譯器

選擇呼叫你定義的建構函式a(int x),所以列印輸出a的值,輸出 1,然後,依據2,派生類自身定義的

部分是按它的定義順序初始化的,即按下面這個順序,b,c,d,x,y.

int b, c; 

const int d; 

a x, y;

所以,依據4,分別參考初始化列表b(v),y(b+2),x(b+1),d(b),a(v) 給出的引數資訊,可知道

初始化b,使用b(v),b被初始化為1。然後,初始化c,由於初始化列表中沒有指定c的初始化,所以

暫時c不被初始化,然後初始化d,根據初始化列表中的d(b),d被初始化為b的值,即為1。然後初始化

a類物件x和y,依據初始化列表中的x(b+1)初始化x,由於b的值為1,所以即相當於x(2),給除了乙個引數

2,則呼叫你定義的建構函式a(int x),列印輸出類a的x物件中的a的值,即輸出2,同理,依據y(b+2)

初始化y,列印輸出3。

最後,依據3,呼叫派生類建構函式,即

b(int v) 

這時,直接忽略初始化列表了,執行這個派生類的建構函式,那麼執行函式體

c=v;則把那個沒初始化的c被賦值為v的值,即c的值為1。最後列印輸出b和c的值

所以再輸出兩個1。

綜上所述:輸出1 2 3 1 1 1*/

C 派生類物件構造順序

構造依如下順序 1.呼叫本類的基類的建構函式 1.1 按照基類成員定義順序對每個成員執行初始化 1.2 執行基類建構函式體 2.呼叫本類的建構函式 2.1 按照本類成員定義順序引用初始化列表對每個成員執行初始化 2.2 執行本類建構函式體 總結為一句 首先初始化本類的基類部分,然後按照宣告的順序依次...

派生類的初始化列表

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

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

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