虚函数,与函数覆盖override的问题

mycodeis0000 2012-04-13 03:27:54

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()
...全文
217 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
mycodeis0000 2012-04-13
  • 打赏
  • 举报
回复
谢谢各位,基本上知道原因了
(q___p)说的非常直接了当
cheng2005 2012-04-13
  • 打赏
  • 举报
回复
继续我刚才的话题,关于基因与继承的联系.
继承的本质并不是基因的传递,而是基因效果的传递,就是说,作为儿子,拥有基因,如果你不改,那么这份基因其实并不是你的,而是你父辈的.当然如果你重写的话,就相当于对基因的改造,以后你的孩子就是拥有你改造后的基因.

这里,你的B对PrintFields进行了改造(重写),所以呢,A的PrintFields就已经被你变了,所有B的后代的基因都是你改造之后的了.
这时,你调用new B(),说明你声明的是B,虽然B会去他的父亲那要东西,调用A的一个基因,但是这个基因PrintFields在B里已经被改造过了,所以要调用B的PrintFields.
传递正能量 2012-04-13
  • 打赏
  • 举报
回复
如果
A a=new A();就不覆盖,因为和B无关

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

那就覆盖掉了

override 中文翻译:覆盖,重写
mycodeis0000 2012-04-13
  • 打赏
  • 举报
回复
请问:bdmh、q___p

覆盖掉了 是不是指,A的PrintFields() 指向了B PrintFields()
传递正能量 2012-04-13
  • 打赏
  • 举报
回复
因为你设置了override ,覆盖掉了

如果你不想覆盖
那就把virtual 和 override 都删除
bdmh 2012-04-13
  • 打赏
  • 举报
回复
virtual override这是多态的概念
B继承自A,B构造时,会调用父类A的构造,但是因为A的PrintFields是虚函数,B中又override了PrintFields方法,但是A中的PrintFields是空执行,没有代码,然后会执行B的PrintFields

110,561

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧