首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

C++ 物件記憶體佈局與多態實現深度探索(二):虛函數表機制

     編輯:關於C++

當類別包含虛函數時,編譯器會為其產生虛函數表(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 位址、虛表位址及虛表條目值,確認:

  • 物件位址各異,vptr 位於物件起始
  • 同類別物件共享虛表位址
  • 覆寫函數對應虛表條目不同,未覆寫者相同

編譯器:VC7.1,結構對齊設為 1 位元組以利觀察。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved