dd ecx
03b35ea8 6cc5849c dchkdata.6cc5849c
03b35eac 003a0043
03b35eb0 0050005c
03b35eb4 006f0072
這兒先來看看虛函式表的指標的記憶體布局,具體看下例
#include
class ******class;
virtual ~******class(){};
int getvalue(void);
virtual void foo(void){};
static void addcount();};
int main()
所得結果如圖所示:
如是乎乙個簡單的c++物件的記憶體布局展示出來了:
由以上分析可以證明以下結論:
虛函式表的指標存在於物件例項中最前面的位置(我使用的是
vc6,至於其他的編譯器嘛,個人能力有限,有待以後考查)。
【除此之外還包含有對其他許多知識點的驗證: 1
非靜態資料成員是影響物件佔據記憶體大小的主要因素,隨著物件數目的增加,非靜態資料成員佔據的記憶體會相應增加。
2 所有的物件共享乙份靜態資料成員,所以靜態資料成員佔據的記憶體的數量不會隨著物件數目的增加而增長。 3
靜態資料成員和非靜態資料成員不會影響物件記憶體的大小,雖然其實現會佔據相應的記憶體空間,同樣也不會隨著物件數目的增加而增加。】
還有一點需要補充的是:
所有的虛函式共享同一張虛函式表。
對於子類例項中的虛函式表,是下面這個樣子:
我們可以看到: 1
)每個父類都有自己的虛表。 2
)子類的成員函式被放到了第乙個父類的表中。(所謂的第乙個父類是按照宣告順序來判斷的)
假設我們有這樣的乙個類:
class
base
virtual
void
g()
virtual
void
h()
}; 對於例項:
derive d;
的虛函式表如下:
我們可以看到下面幾點: 1
)虛函式按照其宣告順序放於表中。 2
)父類的虛函式在子類的虛函式前面。
因為在實際的應用中沒有人會如此無聊的去定義這樣的派生類
derive
,所以讀者可以自己嘗試的寫寫驗證程式,類似第一節中的
pfun。
虛函式表指標,虛函式表
對c 了解的人都應該知道虛函式 virtual function 是通過一張虛函式表 virtual table 來實現的。簡稱為v table。在這個表中,主是要乙個類的虛函式的位址表,這張表解決了繼承 覆蓋的問題,保證其容真實反應實際的函式。這樣,在有虛函式的類的例項中這個表被分配在了 這個例項...
虛函式表和虛函式表的指標
有虛函式的類都有乙個虛函式表,它是實現多型的關鍵。虛函式表可以繼承,如果子類沒有重寫虛函式,那麼子類虛函式表中仍然會有該函式的位址,只不過這個位址指向的是基類的函式實現。如果子類重寫了相應的虛函式,那麼虛函式表中的位址就會改變,指向自身的函式實現。如果派生類中有自己的虛函式,那麼虛函式表中會新增該項...
物件記憶體模型(虛函式,虛函式表,虛指標)
從例子入手,考察如下帶有虛函式的類的物件記憶體模型 1 class a 11 12 class b a 20 21 class c b 注 在子類中出現與父類相同名稱的變數和非虛函式不是最佳實踐,這裡是為了說明其記憶體結構。其物件記憶體結構見下圖。於侯捷老師 對其分析如下 1.每個含有虛函式的類在記...