+ -
当前位置:首页 → 问答吧 → C# new关键字隐藏基类virtual方法

C# new关键字隐藏基类virtual方法

时间:2011-12-14

来源:互联网

代码如下:
  internal class Base
  {
  public virtual void Do()
  {
  Console.WriteLine( "This is base method" );
  }
  }

  internal class Derived : Base
  {
  public new virtual void Do()
  {
  Console.WriteLine( "This is the derived class's hidden method!" );
  }
  }

 Base b = new Derived();
  b.Do();

输出:This is base method
可是按照CLR运行机制:在调用虚实例方法时,首先检查发出调用的变量,然后跟随地址来到发出调用的对象,代码检查对象内部的“类型对象指针”,它指向对象的实际类型,然后,代码在类型对象的方法表中查找引用了被调用方法的记录项,接着调用方法。
按照这个理论上应该输出This is the derived class's hidden method!才对,或者因为使用了隐藏方法,派生类的方法表有什么特殊之处?
求解!

作者: Qiyeye   发布时间: 2011-12-14

这里的代码是在故意制造混乱。同时这也是一个需要紧扣概念的问题

当将一个派生类形的对象赋于一个基类型的引用时

1、如果调用的方法是被派生类型重写的,则调用派生类形的方法 (此处不满足,因为Derived并非重写父类同名方法)
2、不满足上述情况的调用,则调用基类的方法。

其实这里的new(故意隐藏父类同名成员)只是故意制造混淆的。

如果将Derived的Do方法,改写为重写父类的方法,则结果会显示
This is the derived class's hidden method!

作者: chromeV8   发布时间: 2011-12-14