當類別包含虛函數時,編譯器會為其產生虛函數表(vtable),並在每個物件開頭插入虛表指標(vptr),指向該類別的虛表。虛表實質為函數指標陣列,儲存虛函數的實際位址。
struct C040 { virtual void foo() {} };
物件大小 4 位元組(32 位元環境),內含一個 vptr。實測 vptr 指向位址 0x0045B440。
struct C050 : C040 {};
C050 同樣 4 位元組,擁有獨立虛表指標指向 0x0045B444。兩個 C040 物件的 vptr 均指向同一虛表 0x0045B440,驗證虛表屬於類別級別,全體物件共享。
struct C043 { virtual void foo1() {} virtual void foo2() {} };
struct C071 : C043 { virtual void foo1() {} };
C043 與 C071 各有兩條目虛表。C071 覆寫 foo1,導致第一條目指向新函數位址(0x0041D811),第二條目 foo2 仍指向基底實作(0x0041DFE1),符合預期。
透過自訂宏 PRINT_VTABLE_ITEM 印出物件位址、vptr 位址、虛表位址及虛表條目值,確認:
編譯器:VC7.1,結構對齊設為 1 位元組以利觀察。