代码如下:
    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!才对,或者因为使用了隐藏方法,派生类的方法表有什么特殊之处?
求解!

解决方案 »

  1.   

    这里的代码是在故意制造混乱。同时这也是一个需要紧扣概念的问题当将一个派生类形的对象赋于一个基类型的引用时1、如果调用的方法是被派生类型重写的,则调用派生类形的方法 (此处不满足,因为Derived并非重写父类同名方法)
    2、不满足上述情况的调用,则调用基类的方法。其实这里的new(故意隐藏父类同名成员)只是故意制造混淆的。如果将Derived的Do方法,改写为重写父类的方法,则结果会显示
    This is the derived class's hidden method!