override:方法標記為 virtual,移除 newslot,實現真正覆寫。new:方法不標記 virtual,隱藏基類同名方法,編譯期依靜態類型繫結。// C# 代碼
class yyy {
public virtual void abc() { Console.WriteLine("yyy abc"); }
}
class xxx : yyy {
public override void abc() {
base.abc();
Console.WriteLine("xxx abc");
}
}
IL 關鍵點:
yyy.abc 標記 newslot virtual。xxx.abc 標記 virtual(無 newslot)。base.abc() 編譯為 call instance void yyy::abc()(非虛呼叫)。callvirt instance void yyy::abc() 呼叫,運行時分派至 xxx.abc。.method public hidebysig virtual instance void abc() il managed {
ldarg.0
call instance void yyy::abc() // base.abc()
ldstr "xxx abc"
call void [mscorlib]System.Console::WriteLine(string)
ret
}
輸出:yyy abc、xxx abc。
call:靜態繫結,指定方法直接呼叫。callvirt:動態分派,依物件實際類型查找虛擬方法表。這展示了多型在 IL 層級的核心機制。