浏览:4452007-12-10 09:49   来自红泥      :
虚方法调用时方法的方法表位移值是由对象的声明类型决定的,实际调用的方法是由对象的实际类型决定的。也就是objreference-->typehaddle(对象实际类型)-->methodTableAddress+offset(对象声明类型决定)

Base a = new Derived();a.VirtualFunction()
编译器生成的IL是这样的:callvirt Base::VirtualFunction(),是不是对上面的证明?

有点乱,理解的对不?
楼主
  5个月前   Justin Shen      :
callvirt的时候,虽然是在Base上调用VirtualFunction,但实际上会根据a的virtual function table pointer(vptr)来调用VirtualFunction的,而a的vptr指向的是Derived的MethodTable,所以会调用Derived中的VirtualFunction。

如果是call Base::VirtualFunction(),那么会直接调用Base中的VirtualFunction的offset地址,这样就不是虚调用了。

不过,在实际的编译器中,调用非虚方法用的也是callvirt =。=
回复  1楼 回到顶楼 
  4个月前   Anytao      :
这里有一些论述,不过没有从IL方面进行分析,对于理解虚方法的多态机制有所帮助:

http://www.cnblogs.com/anytao/archive/2007/09/10/must_net_15.html
回复  2楼 回到顶楼 
  1个月前   没有昵称      :
每个类都有一个虚函数表,保存所有虚函数的入口地址。
当创建一个类的对象时,这个对象会有一个指针保存了这个虚函数表的起始地址。
无论你怎么做类型转换,这个指针的值是不会变的,所以他就总是会指向同一个函数。
回复  3楼 回到顶楼 

你还不是小组成员,加入小组以后才能发布新主题!
> 返回“CLR基础研究小组”


其他话题

1 27724