C 物件繼承後的記憶體分布

2021-08-28 06:15:25 字數 694 閱讀 1836

1. 如果父類的純虛函式沒有實現,在沒有使用的的情況下(沒有new 或者直接生成物件)編譯不會報未定義。

最近將乙個類物件指標直接轉換為void*儲存到了vector中,使用時再用static_cast轉換為對應的父類指標,發現在多繼承的情況下這樣會有問題。原因是此物件有多個父類,static_cast是直接將父類指標指向了物件的記憶體位址,這樣在呼叫父類方法的時候就出現了問題,找不到這個父類的虛函式。因為在多繼承的情況下,第乙個父類的vfptr才是跟物件的首位址相同,其他父類的依次+4個位元組。  所以想到了用dynamic_cast,但是編譯器報錯void*沒有動態轉換資訊。所以在這種情況下,必須將void*轉換為有型別資訊的指標才可以,而且void* 指向的記憶體位址一定要是對應父類vfptr所在的位置。所以引入以下原則:

如果儲存的是父類指標,那麼從void*轉換為有型別指標時一定也要是對應的父類。如果儲存的是子類指標,那麼一定要先轉換為該子類物件。也就是在放入時時從什麼型別轉為void*的,在用的時候就一定要先轉為什麼型別。這個時候用動態型別轉換就可以轉為其他型別了。

子類中每乙個直接繼承的父類(包含虛函式)都會有乙個vfptr指標,用於指向乙個存放對應虛函式的列表,如果繼承的父類也繼承了其他類的虛函式,那麼都會放在這個表中,順序是由父類到子類。 虛繼承的情況不同。

C 繼承多型下的記憶體分布

2012 05 08 23 36 58 虛函式是物件導向程式設計語言裡乙個很重要的機制,下面我們以乙個c 例子,分析其對應的c語言程式來說明虛函式的機制。物件導向有了乙個重要的概念就是物件的例項,物件的例項代表乙個具體的物件,故其肯定有乙個資料結構儲存這例項的資料,這一資料報括變數,介面函式指標,如...

C 的繼承,多繼承,虛繼承的物件分布的總結

根據幾篇部落格c 物件模型,c 涉及繼承和虛繼承時的記憶體布局 c 物件的記憶體布局 上 作了一些歸納和總結,留著備用吧。討論問題 先看單繼承的例子 include using namespace std class parent virtual void f virtual void g clas...

C 物件在記憶體中的分布

c 通過class的pointers和references來支援多型,這種程式風格就成為 物件導向 一 c 對多型的支援的三種方式 1.把乙個派生類指標隱式轉換成乙個基類指標 ex shape ps new circle 2.經由virtual function機制 ex ps rotate 2.經...