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(),直到堆棧溢出。當使用這個而不是base(循環調用self)時,這個溢出很容易實現。在這種情況下,防止虛函數覆蓋的是什麼?爲什麼在覆蓋和調用虛擬函數時不能獲得stackoverflow異常?
如果這就是'base'的工作方式,那麼任何時候都會使用它,這將是一個計算器,並且根本沒有理由在語言中使用它。 – Servy
@Servy不,你可以用沒有任何問題的基礎調用非虛擬方法。這只是使用虛擬方法的基礎的特殊情況。 – user206334
如果您想調用基類的非虛方法,只需將'this'強制轉換爲基類並調用該方法即可。 'base'的設計專門用於調用基類的虛擬方法版本,因爲它不能在沒有'base'的情況下完成,其他任何'base'的使用都可以在沒有該關鍵字的情況下完成。 – Servy