為什麼派生類的建構函式需要對基類進行初始化,而不能只對派生類中的子物件進行初始化?

時間 2021-06-08 17:37:36

1樓:原子筆

背景:乙個c++ 沒有虛繼承的物件,如果把基類看成樹葉子,最終派生類部分看成樹根,那麼構造的過程是個先葉子後根的「反」深度優先遍歷的過程。有菱形繼承,那麼樹變成圖,繼續深度優先遍歷(注意有的節點會以不同的位址被遍歷2次,沒事)。

有虛繼承時要稍微複雜些,有的線要一分為二,有的線的方向要反過來。

廢話不說了,收尾過來回答問題主的問題:

只對派生類部分初始化違背了類定義isa關係。

派生類的子物件初始化過程中可能會依賴基類部分已經初始化的結果(除了虛表指標)。

2樓:暮無井見鈴

建構函式要初始化整個最終派生類物件。一般情況下就是由每個子物件的建構函式初始化自己對應的子物件。

然而也有建構函式不初始化整個物件的情況:帶虛基類的類物件初始化中,若在虛基類上繼承多於一層,則呼叫中間層次基類的建構函式時,會跳過共同虛基類的初始化。

虛基類表現類似直接基類:每個派生類的建構函式中都首先呼叫虛基類的建構函式,初始化虛基類子物件。

為什麼 C 中,基類指標可以指向派生類物件?

WangKX 語法就這麼規定這叫多型性,如果往深點說,因為子類物件一般比父類物件大,因此這麼指並沒問題,但反過來不行比如子類指標指向父類物件 馬東啥梅來著 不同型別的指標在記憶體中所佔大小是相同的,區別在於編譯器對於指標的解釋是不同的。乙個指標指向某個類的物件,實際上是指向該物件所佔記憶體的首位址位...

C 中為什麼派生類中只有基本型別時,delete乙個指向派生類的基類指標時卻沒有記憶體洩漏?

你試試這樣 class widget public QWidget MSVC的string實現方式是SSO,大致的原理是內建乙個char棧陣列,如果字串很短的話就不使用堆記憶體,你那個寫法string還是空的,沒有分配堆記憶體,從頭到尾都只在棧上有資料當然不存在記憶體洩漏問題,所以你還需要強制地給s...

為什麼公眾需要對科學有乙個基本的了解

世界初祇的邂逅 因為,這是現代人的常識。在我們這個時代,又是在我們這個國家。科學是每個人的必修課,可能是由於近代某些思想的出現,聽專家的話就特別重要,專家當然是科學家。由於我們中國人越來越多是注重物質的需求,物質的實用,而科學能完全滿足。而且我們國家的教育是以科學為中心展開的,所以每個新生兒都要接受...