日期:2014-05-18  浏览次数:20667 次

虚函数,与函数覆盖override的问题
C# code

 class Program
    {
        static void Main()
        {
            B b = new B();

        }
    }

    class A
    {
        public A()
        {
            PrintFields();
        }
        public virtual void PrintFields() { }
    }
    class B : A
    {
        int x = 1;
        int y;
        public B()
        {
            y = -1;
        }
        public override void PrintFields()
        {
            Console.WriteLine("x={0},y={1}", x, y);
        }


    }



该代码运行后 x=1,y=0
调试的时候发现运行类A 构造函数A()时 调用 PrintFields();
缺运行了类B的 public override void PrintFields()

我想知道为什么类A 构造函数内部调用PrintFields();
确会去运行类B的 public override void PrintFields()


------解决方案--------------------
virtual override这是多态的概念
B继承自A,B构造时,会调用父类A的构造,但是因为A的PrintFields是虚函数,B中又override了PrintFields方法,但是A中的PrintFields是空执行,没有代码,然后会执行B的PrintFields
------解决方案--------------------
因为你设置了override ,覆盖掉了

如果你不想覆盖
那就把virtual 和 override 都删除
------解决方案--------------------
如果
A a=new A();就不覆盖,因为和B无关

如果
B b=new B();或者A a=new B();

那就覆盖掉了

override 中文翻译:覆盖,重写
------解决方案--------------------
继续我刚才的话题,关于基因与继承的联系.
继承的本质并不是基因的传递,而是基因效果的传递,就是说,作为儿子,拥有基因,如果你不改,那么这份基因其实并不是你的,而是你父辈的.当然如果你重写的话,就相当于对基因的改造,以后你的孩子就是拥有你改造后的基因.

这里,你的B对PrintFields进行了改造(重写),所以呢,A的PrintFields就已经被你变了,所有B的后代的基因都是你改造之后的了.
这时,你调用new B(),说明你声明的是B,虽然B会去他的父亲那要东西,调用A的一个基因,但是这个基因PrintFields在B里已经被改造过了,所以要调用B的PrintFields.