class A
    {
        public void F() { Console.WriteLine("A.F"); }
        public virtual void G() { Console.WriteLine("A.G"); }
    }
    class B : A
    {
        new public void F() { Console.WriteLine("B.F"); }
        public override void G() { Console.WriteLine("B.G"); }
    }
    class virtualMethod
    {
        internal static void main()
        {
            B b = new B();
            A a = b;//什么意思?对象a就是对象b了吗?
            a.F();//为什么要输出A.F,它不是相当于b.F()吗
            b.F();
            a.G();//a到底是A的对象还是B的对象?
            b.G();
        }
    } 产生的输出:
A.F 
B.F 
B.G 
B.G 

解决方案 »

  1.   


    class virtualMethod
        {
            internal static void main()
            {
                B b = new B();
                //这儿仅仅是将b的引用复制给a,a和b这时候指向内存中同一个地址。
                A a = b;//什么意思?对象a就是对象b了吗?
                //b中的F()使用了new关键字,相当于b有二个F()方法。
                a.F();//为什么要输出A.F,它不是相当于b.F()吗
                b.F();
               //a在内存中的方法表是A的不是b的。
                a.G();//a到底是A的对象还是B的对象?
                b.G();
            }
        } 上面的代码主要考查了对面向对象中继承、对象实例化等知识点。
    代码在编译时会创建二个方法表,一个是A.MethodTable,里面包括A类中的所有方法。一个是B.MethodTable,里面包括的是B类的方法。在内存中大概是这样的:
    A:
    A.F()
    A.G()
    B:
    B.F()//直接继承父类的F()方法
    B.F()//这个是new关键字创建的,没有覆盖掉父类的F()方法。
    B.G()//对父类方法G()的重载。
      

  2.   

    a和b指向同一个对象,a可用,b亦可用