首页 新闻 会员 周边 捐助

C#中虚拟方法的执行是根据什么确定的?

0
悬赏园豆:80 [已解决问题] 解决于 2010-01-28 21:36
public class A
{
   public A() { PrintFields(); }
   public virtual void PrintFields() { //.. }
}
public class B : A
{
   private int x = 2 , y;
   public B():base() { this.y = -1; }
   public override void PrintFields()
     {
         Console.WriteLine("X = {0} , Y = {1}" , x , y);
      }
}
 
public class Test
{
   static void Main()
     {
         B b = new B();
         //执行打印结果:
         //X = 2 , Y = 0
     }
}
 
问题一:
在执行B的构造函数之前首先执行A的构造函数,但是在A的构造函数内部调用了一个PrintFields()方法,这个方法是A对象本身的虚方法吗?
问题二:
如果不是的话,为什么?这里用到了虚拟方发表了吗?或者说换一种问法,由于是创建了B对象所以才执行的B对象中PrintFields()方法吗?那么A对象是根据什么知道该调用那个PrintFields()方法?
问题三:
如果说虚拟方法的执行是依照对象运行时类型决定的(CLR),但是这个B对象还没有完全创建完哪.
问题补充: @一滴血: 我看到了你的解释,在A构造函数执行的this.PrintFields()的对象类型是B吗?希望你能看到并可以给我一个答复. 问题是: public A() { //调用B.PrintFields(); A对象是怎样确定下来的? PrintFields(); } 根据你的解释我又从新测试了一下,结果如你所说的确在创建A对象时执行是A.PrintFields()方法,按你的意思是不是在创建B对象时即使在A对象的构造函数中调用PrintFileds()方法,其实CLR运行时已经将对象的类型确定下来了,并且该重写的方法指针也指向了该B对象了?不知我的理解对吗?
shuzhiguolu的主页 shuzhiguolu | 初学一级 | 园豆:32
提问于:2010-01-27 11:10
< >
分享
最佳答案
0

当派生类重写某个虚拟成员时,即使该派生类的实例被当作基类的实例访问,也会调用该成员;

收获园豆:80
一滴血 | 小虾三级 |园豆:1602 | 2010-01-27 11:31
由于B继承了A,而且A中的方法是virtual,B对象override方法PrintFields(),因此A,B都指向了B中的PrintFields();
一滴血 | 园豆:1602 (小虾三级) | 2010-01-27 14:29
@一滴血: 谢谢你再次给于我详细的解释,其实在第一次的答案中你已经说出了虚拟方法的本质。只是我的脑海中没有转过来,再次感谢!我已经点击了支持应该悬赏分已经给你了吧。如果未收到告知我一声,我会给你的。谢谢了!
shuzhiguolu | 园豆:32 (初学一级) | 2010-01-28 21:36
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册