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

C# 到 IL 深度解析:第4章 關鍵字與操作符 (上)(12) - 繼承與虛擬方法調用的編譯期與運行期繫結

     編輯:關於C語言

繼承關係與方法調用繫結

C# 繼承使用 :,IL 使用 extends。編譯器根據靜態類型決定呼叫前綴(yyy::abc 或 xxx::abc),但 callvirt 使實際調用取決於運行期物件類型。

範例:new 隱藏基類虛擬方法

// C# 代碼
class yyy { public virtual void abc() { Console.WriteLine("yyy abc"); } }
class xxx : yyy { public new void abc() { Console.WriteLine("xxx abc"); } }

IL:

  • 基類 yyy.abc:newslot virtual。
  • 派生類 xxx.abc:instance void abc()(無 virtual、無 newslot)。
  • 入口點仍以 callvirt instance void yyy::abc() 呼叫,故輸出 yyy abc。

若將變數宣告為 xxx a = new xxx(); a.abc();,編譯器會發出 call instance void xxx::abc(),輸出 xxx abc。這證明 new 僅影響編譯期繫結。

關鍵結論

  • virtual + callvirt = 運行期多型。
  • new = 編譯期靜態繫結隱藏。
  • IL 保留完整繼承鏈與方法槽位資訊,由指令選擇決定繫結行為。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved