public abstract class A  {  public A()  {  Console.WriteLine('A');  }  public virtual void Fun()  {  Console.WriteLine("A.Fun()");  }  }  public class B: A  {  public B()  {  Console.WriteLine('B');  }  public new void Fun()  {  Console.WriteLine("B.Fun()");  } 
}
}
static void Main(string[] args)
{
//
// TODO: 在此处添加代码以启动应用程序
//
A a = new B();  a.Fun(); }
输出的结果为什么是这样???
A
B
A.Fun()

解决方案 »

  1.   

    new修饰符是用于显式隐藏从基类继承的成员,并不是重写从基类继承的成员。
      

  2.   

    public new void Fun() 
    注意这里是new,而不是override
      

  3.   

    编译时:
    A a = new B(); //声明了一个A引用
    a.Fun();//调用A引用的Fun函数
    运行时:
    A a = new B(); //分配了一个B对象,并使用A引用指向这个对象
    a.Fun();  //调用A的fun函数所以结果就是a.Fun
      

  4.   

    丫的,仔细看看virtual function那部分。
      

  5.   

    通过实验,我觉得这个程序应该是这样执行的:
    首先A建了个叫做a的引用,
    然后又建了个B的实例让a来指向它。
    在建B的实例时调用了B的基类的构造函数以及B的构造函数。
    接着执行a.Fun(); 
    由于a是属于类型A的,因此结果是A.Fun()。