天天看點

對象記憶體布局 (6)

如果在對象記憶體布局 (5)的代碼中,将Base1中的兩個虛函數聲明删除,同時将main函數中的下面代碼注釋掉(因為現在隻有兩張虛函數表了):

代碼如下:

運作結果:

對象記憶體布局 (6)

通過修改代碼的位置以及運作結果可以知道,Derived對象的memory layout圖解如下:

對象記憶體布局 (6)

由上面分析可知:

其一,Base1 subobject排列在Base2 subobject之後,而在Base3 subobject之前,盡管它在Derived類的繼承清單中排列在首位,因為它已經沒有虛函數表了,但仍然排列在Derived類的成員變量m_derived之前。

其二,在Derived類中定義的虛函數Derived::vfDerived()附加在一個虛函數表的最後,這時第一張虛函數表是類Base2的。