读书人

虚方法调用产生IL代码有一处不太明白

发布时间: 2013-09-07 14:12:45 作者: rapoo

虚方法调用产生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方法
[解决办法]
既然是虚方法,自然是从基类开始搜索的。

读书人网 >C#

热点推荐