C 編譯器 虛基類及其派生類的建構函式

2021-05-12 09:52:35 字數 539 閱讀 7864

c++編譯器:虛基類及其派生類的建構函式

如果虛基類中宣告了非預設形式的建構函式,並且沒有宣告預設形式的建構函式,那麼在整個繼承關係中,直接或間接繼承虛基類的所有派生類,都必須在建構函式的成員初始化類表中列出對虛基類的初始化。

輸出:a1::display()...1

看起來在建立c1的物件時有三次初始化a1的ia1資料成員,但編譯器採取了也個策略是上述問題不會發生:

上例建立物件c1時,d1就是最遠派生類。

建立乙個物件時,如果這個物件中含有從虛基類繼承來的成員,則虛基類的成員由最遠派生類的建構函式通過條用虛基類的建構函式進行初始化,該類的其他派生類對虛基類建構函式的呼叫自動被忽略。(上列中b1,b2)

可將上述4個注釋行前後內容對換測試。

輸出 a1::display()...0

可是編譯器為什麼要使用這種策略?在上述例子中假如編譯器不使用這種策略

21行語句 :c1(int i):b1(i),b2(i),a1(i){}  能否能其他方式實現虛基類的初始化?假如能實現會帶來什麼問題?

基類和派生類,虛函式

基類負責定義在層次關係中所有類共同擁有的成員,而每個派生類定義各自持有的成員。基類希望它的派生類各自定義適合自身的版本,此時基類就將這些函式宣告成虛函式。class quote 派生類必須通過使用類派生列表明確指出它是哪個基類繼承而來。類派生列表的形式 首先是乙個冒號,後面緊跟以逗號分隔的基類列表,...

C 基類和派生類的建構函式

前面我們說基類的成員函式可以被繼承,可以通過派生類的物件訪問,但這僅僅指的是普通的成員函式,類的建構函式不能被繼承。建構函式不能被繼承是有道理的,因為即使繼承了,它的名字和派生類的名字也不一樣,不能成為派生類的建構函式,當然更不能成為普通的成員函式。在設計派生類時,對繼承過來的成員變數的初始化工作也...

基類與派生類的建構函式

一 預設建構函式的呼叫關係 通過下面的例子,我們來看一下基類與派生的建構函式的呼叫順序。建立時先基類後派生類。銷毀時先派生類後基類。include include using namespace std class cbase cbase class cderive public cbase cde...