【发布时间】:2013-01-08 19:38:09
【问题描述】:
class Program
{
static void Main(string[] args)
{
B foo = new B();
foo.DoWork();
Console.ReadLine();
}
}
public class A
{
public virtual void DoWork() { Console.WriteLine("A"); }
}
public class B : A
{
public override void DoWork() { base.DoWork(); Console.WriteLine("B"); }
}
为什么我没有收到 StackOverflow 异常?据我了解,调用 foo.DoWork(),然后调用 base.DoWork(),它是虚拟的并在类 B.DoWork() 方法中被覆盖,它将再次重复调用 base.DoWork(),直到堆栈溢出.当使用 this 而不是 base(调用 self 的循环循环)时,很容易实现这种溢出。在这种情况下,是什么阻止了虚函数覆盖?
【问题讨论】:
-
如果
base是这样工作的,那么任何时候使用它都会是一个stackoverflow,根本没有理由在语言中使用它。 -
@Servy 不,您可以使用 base 调用非虚拟方法而不会出现任何问题。这只是将 base 与虚拟方法一起使用的一个特例。
-
如果你想调用基类的非虚拟方法,只需将
this转换为基类并调用该方法。base字面意思是专门为调用基类版本的虚方法而设计的,因为没有base就无法完成,base的任何其他用途都可以在没有该关键字的情况下完成。
标签: c# overriding stack-overflow virtual-functions