1. 程式人生 > >C++物件繼承後的記憶體分佈

C++物件繼承後的記憶體分佈

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

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

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

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