using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;namespace ConsoleApplication1
{
    class Program
    {
        public class A
        {
            public A()
            {
                Console.WriteLine("construct in A");
            }            public virtual void Fun()
            {
                Console.WriteLine("A.Fun()");
            }
        }
        public class B : A
        {
            public B()
            {
                Console.WriteLine("construct in B");
            }
            public new void Fun()
            {
                Console.WriteLine("B.Fun()");
            }
        }
        static void Main(string[] args)
        {
            A a = new B();
            a.Fun();
        }
    }
}
问题1,我的理解是这里是重载.
问题2,a对象是B类型,为什么A a(这里是转换类型么?)之后调用Fun()不能调用的不是自己的Fun();
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;namespace ConsoleApplication1
{
    class Program
    {
        public class A
        {
            public A()
            {
                Console.WriteLine("construct in A");
            }            public virtual void Fun()
            {
                Console.WriteLine("A.Fun()");
            }
        }
        public class B : A
        {
            public B()
            {
                Console.WriteLine("construct in B");
            }
            public override void Fun()
            {
                Console.WriteLine("B.Fun()");
            }
        }
        static void Main(string[] args)
        {
            A a = new B();
            a.Fun();
        }
    }
}
问题3,按照程序的正确结果来推理,把a转换成A类型之后,是如何实现调用A类型的Fun(),怎样转换成override的B里面的Fun();

解决方案 »

  1.   

    问题1,我的理解是这里是重载.
    我理解既不是重载也不是重写,而是2个除了名字一样,完全无关的方法问题2,a对象是B类型,为什么A a(这里是转换类型么?)之后调用Fun()不能调用的不是自己的Fun();
    因为用了new关键字,A类型的fun和B的fun就不是同一个方法,编译器不会通过多态的机制动态绑定,而是直接在编译时指定了A类型的fun方法问题3,按照程序的正确结果来推理,把a转换成A类型之后,是如何实现调用A类型的Fun(),怎样转换成override的B里面的Fun();
    override,这里是重写了,就通过多态机制在运行时动态绑定了
      

  2.   

    重写是子类的方法覆盖父类的方法,要求方法名和参数都相同重载是在同一个类中的两个或两个以上的方法,拥有相同的方法名,但是参数却不相同(参数的个数或者参数类型不同),方法体也不相同,最常见的重载的例子就是类的构造函数,可以参考API帮助文档看看类的构造方法
      

  3.   

    问题1.这是赤裸裸的覆盖,重载的条件是值函数的参数列表不同,肯定不是重载
    new关键字可以省略,当然你会被编译器警告问题2.很好理解。你用了new之后那个B类没有任何多态性质了,没有虚函数表了,无法动态绑定函数了。
    A a = new B();
    a.Func()是静态绑定的。Func()在编译期已经决定了是A.Func()问题3. 动态绑定
    编译器只是编译为调用a引用的instance的虚函数表里的Func方法
    实际运行时,a引用的是B的instance,所以调用的是B的Func方法
      

  4.   

    new和override的区别
      

  5.   

    问题1,我的理解是这里是重载.不是----------------------------------------问题2,a对象是B类型,为什么A a(这里是转换类型么?)之后调用Fun()不能调用的不是自己的Fun();是隐式类型转换,当前即为 A 类型的实例  虽然 Fun 是虚方法 但由于子类B使用 New 来隐藏Fun 方法,在A实例调用Fun 方法时 只会调用内部所定义的------------------------------------问题3,按照程序的正确结果来推理,把a转换成A类型之后,是如何实现调用A类型的Fun(),怎样转换成override的B里面的Fun();Fun 是虚方法 子类B使用 override 来重写Fun 方法,在A实例调用Fun 方法时 就会调用子类所定义的Fun方法