继承类中new关键字与override的区别

public abstract class A
    {
        public A()
        {
            Console.WriteLine('A');
        }
        public virtual void Fun()
        {
            Console.WriteLine("A.Fun()");
        }
    }

    public class B : A
    {
        public B()
        {
            Console.WriteLine('B');
        }

        //public new void Fun()      //注意这里是new 关键字 而不是override
        public override void Fun()   //当关键字为 override的时候  将B的实例赋给A的时候 输出应该为B的Fun()函数
        {
            Console.WriteLine("B.Fun()");
        }

    }
    class Program
    {
        static void Main(string[] args)
        {
            A a = new B();
            //由于派生类B 使用了new关键字来改写基类A里的方法
            /*
             * 为什么输出结果为 A B A.FUN()?
             * 
             * 一:为什么输出为A B
             * 首先输出A  B   因为子类的任何构造函数 都会先调用执行父类的默认构造函数 
             * 所以当创建B的实例时候, 程序先运行到B的构造函数处 然后检测是否有父类A的构造函数A() 如果有,立刻跳转到父类A处 并优先执行A() 然后再执行本身的构造函数
             * 
             * 二:为什么输出为A.Fun()  而不是 B.Fun()?
             * 虽然派生子类B 也实现了 Fun()方法  但是子类B使用的是new关键字  而不是重写override
             */
            a.Fun();        //输出结果为  A  B  A.FUN()

            Console.Read();
        }
    }

 

posted @ 2013-03-23 23:58  SilverSky(Jason)  阅读(169)  评论(0)    收藏  举报