定义一个父类跟子类:
public  class Base
    {
        public virtual void f()
        {
            Console.WriteLine("Base.f()");
        }
    }
    class Child : Base
    {
        public override void f()
        {
            Console.WriteLine("Child.f()");
        }
    }
在Main函数中的语句及其输出:
 Base b = new Base();      
 Child c = new Child();           
 b = c;
 b.f();   //输出为:Child.f()
 (b as Child).f();    //输出为:Child.f()
 (b as Base).f();     //输出为:Child.f()我的问题是: "(b as Base).f();  "中不是已经把b转换为父类的类型吗,为什么输出的还是子类中的函数?

解决方案 »

  1.   

    多态的实现是需要父类指针或引用来支持的
    Base ba;
    ba=b;
    ba.f();
      

  2.   

    看错了

    因为b本来就是一个Child的实例,其其类的vmt已经被派生类修改了,所以vmt中的函数指向的是派生类的函数;
      

  3.   

    可是你的子类的方法没有用new啊。你是把子类当作父类调用,但子类还是子类,不会变成父类。
      

  4.   

    类变量实际为指针。
    在         
    b = c;
    后b所引用对象已经是Child了。
    (b as Base)只是保证类型转换不会出现异常,不能改变b的类型,还是Child的。在调用方法是当然是调用Child.f()了
      

  5.   

    因为你写了一句
    b = c; //此事b的实例也是Child类型的
    对于Virtual/Override这种晚绑定(运行时决定绑定方法的类型)来说,引用是什么类型不重要,关键是看他的实例是什么类型的,这儿,实例是Child类型的,所以调的还是child的方法楼主要是有兴趣的话可以看看我在这个问题中的回答
    http://topic.csdn.net/u/20090724/22/80702547-66ce-454f-b404-f406f5e5152e.html
      

  6.   

    因为b本来就是一个Child的实例,其其类的vmt已经被派生类修改了,所以vmt中的函数指向的是派生类的函数;