为什么 子类的实例向父类转型之后,再调用父类中定义并在子类中被override过的方法,实际执行的是子类的方法?
我知道这种现象的存在,但是怎么解释这种现象?
  class A
    {
        public virtual void fun1()
        {
            Console.WriteLine("1、A --> public void fun1()");
        }
        public void fun2()
        {
            this.fun1();
        }
    };
    class B : A
    {
        // 覆写了fun1()方法
        public override void fun1()
        {
            Console.WriteLine("2、B --> public void fun1()");
        }
        // 增加了一个fun3()方法
        public void fun3()
        {
            Console.WriteLine("3、B --> public void fun3()");
        }
    };
    public class OODemo01
    {
        public static void Main(String[] args)
        {
            A a = null;
            a = new B();
            // 子类对象为父类实例化
            // fun1方法被子类覆写了
            // B b = null ;
            // b = (B)a ;
            a.fun2();            B b = new B();
            (b as A).fun1();
            b.fun2();            // b.fun2() ;
            Console.Read();
        }
    };

解决方案 »

  1.   

    子类的实例向父类转型之后,再调用父类中定义并在子类中被override过的方法,实际执行的是子类的方法。子类的实例向父类转型之后,调用父类中定义并在子类中没有被override过,而是直接继承来的的方法,实际执行的效果和子类的实例直接调用无异。这样的话,转型不转型似乎没有差异呀?
      

  2.   

    比如说你爸爸会打篮球,但只会三分球(父类方法)
    而你也继承了你爸爸会打篮球,但你扣篮,三分球都会(override)
    那你去打篮球的时候是只会三分球还是扣篮,三分球都用呢?
    呵呵,可能不恰当!
      

  3.   

    我告诉你,你是个好学生,比那些只知道敲代码的人强多了。
    我给你解释这一句代码:
    B b = new B();
                (b as A).fun1();
    为什么他调用的是类型B中的方法,而不调用类型A中的方法呢?
    原因是你虽然把b强制转换为类型A,但是你别忘了,这个b只是作为A类型使用,但其实他的引用是B类型的。
    因为你new的是B类型,他是B类型的一个实例。所以虽然你把它作为A类型来使用,但实际上他还是会调用自身类型中定义的方法。