public class A : IDisposable
{
    protected virtual void Write()
    {
        Console.WriteLine("Write A");
    }    public virtual void F()
    {
        this.Write();
    }
}public class B : A
{  
    protected override void Write()
    {
        Console.WriteLine("Write B");
    }     
}
B b=new B();
b.F();当B里的Write是override时,输出Write B
当B里的Write是new时,输出Write A
这是为什么?大概知道是多态性的原因,请详细解释一下。

解决方案 »

  1.   

    .net在创建对象时先创建基类成员,再创建自身的成员,并维护MethodTable(方法表),override时,会用新方法(自身的方法的信息覆盖基类方法)所以调用b.F()时,实为调用了自身的方法地(输出"Write B"),new时,在MethodTable(方法表)中不会覆盖基类的方法,所以在调用从基类继承而的F()方法时调用了基类的Write(),所以输出WriteA
      

  2.   

    当B里的Write是override时,输出Write B 
    ------------
    因为Write在B中重新了基类的Write,所以调用B.F时,F会调用新的Write。
    当B里的Write是new时,输出Write A 
    ----------------------
    很显示啊,没有override关键字,因此没有重新基类的方法,所以F只会调用基类的方法。
      

  3.   


    override: A中F方法调用A中的Write(),而此时A中的Write()已经被B中的write重写了,所以输出B,
    new:      A中F方法调用A中的Write(),此时A去查找他的write方法在子类中有没有被重写,此时new表明B中的方法是覆盖父类的方法,并没有重写故输出A
      

  4.   

    override重写虚方法,那么就只剩下重写以后的方法;
    new隐藏基类的方法,那么基类的方法和当前类的方法同时存在只是被隐藏了;