派生類不能在成員初始化列表中直接初始化基類的成員

2021-06-19 21:13:04 字數 630 閱讀 6944

派生類不能在成員初始化列表中直接初始化基類的成員

初始化基類成員

建構函式是不可繼承的。因此,派生類的建構函式必須通過呼叫基類的建構函式初始化基類成員,不能夠在派生類初始化列表直接初始化基類的成員,「越級初始化」。派生類的建構函式的一般格式為:

派生類名(形參表):基類名1(形參表1),基類名2(形參表2)···

注意事項:

(1)在建立派生類物件時,先呼叫基類的建構函式,然後呼叫派生類的建構函式;撤銷物件時,析構函式被呼叫的順序則相反。

(2)若派生類中包含物件成員,則派生類的建構函式初始化成員列表中既要列出基類的建構函式也要列出物件的建構函式。派生類定義物件時,先呼叫基類的建構函式,再呼叫物件的建構函式,最後呼叫派生類的建構函式。

像 c++ primer習題15.16 (a)

struct base

protected:

int id;

};struct c1:public base

};編譯會產生如下錯誤:

1>.\1508.cpp(12) : error c2512: 「base」: 沒有合適的預設建構函式可用

1>.\1508.cpp(12) : error c2614: 「c1」: 非法的成員初始化:「id」不是基或成員

派生類的初始化列表

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

成員初始化列表

類物件的構造順序是這樣的 1.分配記憶體,呼叫建構函式時,隱式 顯示的初始化各資料成員 初始化階段可以是顯式的或隱式的,取決於是否存在成員初始化表。隱式初始化階段按照宣告的順序依次呼叫所有基類的預設建構函式,然後是所有成員類物件的預設建構函式。2.進入建構函式後在建構函式中執行一般計算 計算階段由建...

成員初始化列表

任乙個物件的建立都要呼叫建構函式,而在建構函式中一般要給物件屬性賦值。成員初始化列表 member initialize list 是建構函式中特有的語法,用以簡化對物件屬性的賦值。其用法如下 class myclass 以上 相當於 class myclass 用成員初始化列表的語法來表述很顯然 ...