如下代码所示:

class mm
    {
        public void F()
        {
            Console.WriteLine("mm.F()\n");
        }

        public virtual void G()        //声明了一个虚方法
        {
            Console.WriteLine("mm.G()");
        }
    }
    class nn : mm
    {
        new  public void F()         //隐藏了父类的F方法
        {
            Console.WriteLine("nn.F()\n");
        }

        public override void G()        //重写了方法G
        {
            Console.WriteLine("nn.G()");
        }
    }
    class Test
    {
        static void Main()
        {
            mm a = new mm();

            nn b = new nn();//实例化一个nn的对象b

            mm c = b; //把mm的对象c指向b

            Console.WriteLine("非虚方法");

            a.F();
            b.F();
            c.F();

            Console.WriteLine("虚方法");
            a.G();
            b.G();
            c.G();
            Console.ReadKey();
        }
    }

以上代码中的对象b没什么好说的,运行时与编译时类型均为nn

而对象c的运行时类型为nn,编译时类型为mm

说说原因,因为对象b,c本身都是引用类型,在编译时对象c的类型由我们写的mm c来确定,而在程序运行后发现c引用的内容实际是b所引用的内容,而对象b的类型是确定为nn的(因已实例化了),所以c的运行时类型就和b的类型相同了。

对于非虚方法来说,调用哪个方法取决于该实例编译时的类型

但对于虚方法来说,调用哪个方法取决于该实例运行时的类型

posted on 2010-05-18 09:16  aparche  阅读(1501)  评论(2编辑  收藏  举报