虚方法调用产生IL代码,有一处不太明白,求助!!!
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using ConstDomain;
namespace CLRConst
{
public class A
{
public virtual void Print()
{
Console.WriteLine("A Print");
}
}
public class B : A
{
}
public class C : B
{
public override void Print()
{
Console.WriteLine("B Print");
}
}
class Program
{
static void Main(string[] args)
{
A a = new A();
a.Print(); //IL代码:callvirt instance void CLRConst.A::Print()
A b = new C();
b.Print();//IL代码:callvirt instance void CLRConst.A::Print()
C c = new C();
c.Print();//IL代码:callvirt instance void CLRConst.A::Print() 这里有不理解
Console.Read();
}
}
}
对于a.Print()和b.Print()的IL代码没有异议,编译器只关心变量声明类型(都是A)所以可以调用Print
其后编译器发现Print是虚方法,因此调用指令为callvirt
所以产生的IL代码 :callvirt(虚调用) instance void CLRConst.A(变量类型都是A)::Print() 是可以理解的。
但是对于 C c=new C();c.Print()的IL代码有点不明白,编译器关心声明类型(这里是C)
所以我觉得产生的指令应该是:callvirt instance void CLRConst.C
::Print()
我知道我肯定是错的,想求助一下
callvirt instance void TYPE::Print()
这个TYPE并不是以声明类型为准的,而是以这个虚方法最开始定义处的类型为准(这里是A)吗?
C# 虚方法
[解决办法]
什么叫继承,什么叫重写
C哪有Print方法,C的Print只是重写A的而已。
public new void Print()
这样C才会有Print方法
[解决办法]
既然是虚方法,自然是从基类开始搜索的。