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()가 불려지면 B.DoWork() 메서드에서 오버라이드 된 virtual 인 base.DoWork()가 호출되어 스택이 오버플로 될 때까지 base.DoWork()를 다시 반복한다. . 이 overflow는 base (self를 호출하는 순환 루프) 대신에 이것을 사용할 때 쉽게 얻을 수 있습니다. 이 경우 가상 함수 오버라이드를 방지하는 것은 무엇입니까?오버 라이딩 및 가상 함수 호출에서 stackoverflow 예외가 발생하지 않는 이유는 무엇입니까?
이것이'base'의 작동 방식이라면, 언제든지 그것을 사용하면 언제든지 stackoverflow가 될 것이고, 언어로 사용하게 될 이유가 전혀 없을 것입니다. – Servy
@Servy 아니, 문제없이 기본을 사용하여 비 가상 메서드를 호출 할 수 있습니다. 이것은 가상 메서드로 기본을 사용하는 특별한 경우입니다. – user206334
기본 클래스의 비가 상 메소드를 호출하려면 'this'를 기본 클래스에 캐스트하고 메소드를 호출하십시오. 'base'는'base' 없이는 할 수 없기 때문에 가상 메소드의 기본 클래스의 버전을 호출하도록 특별히 설계되었습니다.'base'의 다른 용도는 그 키워드없이 할 수 있습니다. – Servy