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

C#虛函數解析機制理論基礎(一):方法繼承鏈構建規則與調用解析算法

     編輯:關於C語言

用詞約定

  • 方法簽名**:返回類型+方法名+參數列表,唯一標識方法。
  • 聲明方法**:給出簽名;定義方法**:給出執行代碼體。
  • 同名方法**:簽名相同的兩個方法。
  • 重寫**:子類繼承父類聲明,重新定義實現。
  • 使用**:含顯式(代碼指明)與隱式(上下文推斷)。
  • 某類的方法**:該類定義+遞歸繼承自直接父類的方法。

四大關鍵字與繼承鏈語義

關鍵字繼承鏈語義
virtual允許子類同名方法與其建立繼承鏈(開放鏈尾)
override與父類同名方法建立繼承鏈,隱式virtual(延續鏈)
new切斷與父類同名方法的繼承鏈(新鏈頭)
sealed延續鏈並封閉(不可再被子類override),必須配合override

無關鍵字時默認new語義(隱藏父類同名方法),編譯器給出警告建議顯式new。

方法繼承鏈構建算法

  1. 列出從子類到父類的類繼承鏈**,標記各類對目標方法的首次定義/重定義。
  2. 從父類向子類遍歷,按規則構建方法繼承鏈**:
    • 無override/sealed的定義 → 鏈頭(新鏈開始)
    • 有virtual → 附加到當前鏈
    • 遇到new → 當前鏈立即結束(該方法不入鏈)
    • 遇到sealed → 加入鏈後結束鏈

調用解析算法

調用時(如A ref = new C(); ref.Foo()):

  1. 檢查方法是否虛方法(有virtual):
    • 非虛 → 直接調用引用類型(父類)版本。
    • 虛 → 沿方法繼承鏈向下尋找,執行鏈尾**方法。

術語澄清

  • 子類**:對象實際類型(動態類型)。
  • 父類**:調用時使用的引用類型(靜態類型),必為子類基類。

此理論框架統一解釋override/new/sealed/virtual任意組合行為,為實戰驗證(下篇)奠定基礎。

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