虚函数,与函数覆盖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.