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

CLR 虛方法多態調用深度解析(一):MethodTable 佈局與調用指令

     編輯:關於.NET

通過 Windbg 觀測 .NET 運行時,揭示虛方法多態調用的底層機制:MethodTable 佈局、偏移量固定、調用指令序列。驗證繼承、覆寫、隱藏(new)對表結構的影響。

實驗類別結構

class Base {
    virtual void VirtualFun1();
    void NoneVirtualFun1();
    virtual void VirtualFun2();
    virtual void VirtualFun3();
}
class Derived : Base {
    override void VirtualFun1();
    new virtual void VirtualFun2();   // 隱藏
    virtual void VirtualFun4();       // 新增
}

Base MethodTable 佈局

  • 前 4 槽:Object 虛方法(ToString、Equals、GetHashCode、Finalize)。
  • 槽 4-6:Base 三個虛方法(VirtualFun1/2/3)。
  • 槽 7:非虛方法 NoneVirtualFun1 + 默認構造函數。
  • 非虛方法不進入虛方法槽表,調用時直接按元數據 Token 綁定。

Derived MethodTable 佈局變化

  1. 繼承基類所有虛方法槽,順序不變。
  2. VirtualFun1 覆寫 → 槽 4 指向 Derived 實現。
  3. VirtualFun2 隱藏(new)→ 不覆蓋槽 5,基類實現保留;新增槽 7 指向 Derived.VirtualFun2。
  4. VirtualFun4 新增 → 追加槽 8。
  5. 非虛方法 不複製 到子類表。

多態調用指令序列

Base b = new Derived();
b.VirtualFun1();  // 調用 Derived 實現

; 編譯生成匯編
mov ecx, esi                ; 對象引用
mov eax, [ecx]              ; MethodTable 指針
call dword ptr [eax + 3Ch]  ; 偏移量 3Ch 對應 VirtualFun1 槽

關鍵點:偏移量 3Ch 在整個繼承鏈中固定不變。Base 與 Derived 的 MethodTable 槽 4 位置相同,指向不同實現,由此實現多態。

核心結論

  1. 每個類型對應唯一 MethodTable。
  2. 子類 MethodTable 包含父類所有虛方法槽,非虛方法不包含。
  3. CLR 通過 對象 -> MethodTable -> 固定偏移量 定位具體方法實現,完成多態分派。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved