class B 

   public virtual void foo () {} 
} class D : B 
{
  public override void foo () {} } 
class N : D { public new void foo () {} public static void Main() { N n = new N (); n.foo( ) ; ((D)n).foo( ) ; ((B)n).foo( ) ; // 这里调用的是哪个类的foo ?为什么?}} 

解决方案 »

  1.   

    n.foo( ) ; //这里调用N的foo。((D)n).foo( ) ; //这里调用D的foo((B)n).foo( ) ; // 这里调用的是D的foo,因为n既然是个N类的对象,而它的父类重写了祖父类的foo,那么调用的就是最后重写的那个函数。而既然如此,为什么不调用N自己的foo呢?那是因为N的foo被声明为“new”,“new”的含义就是:“我是个新的函数,只是名字跟你们一样而已,别以为名字跟你们一样就把我当成你们的重写版本,不是的!”^_^
      

  2.   

    N有了自己新的foo,同时又从父类那里继承来了重写了祖父的foo的foo。:)