Virtual позволяет наследующему классу заменить метод, который затем использует базовый класс.
public class Thingy
{
public virtual void StepA()
{
Console.Out.WriteLine("Zing");
}
public void Action()
{
StepA();
Console.Out.WriteLine("A Thingy in Action.");
}
}
public class Widget : Thingy
{
public override void StepA()
{
Console.Out.WriteLine("Wiggy");
}
}
class Program
{
static void Main(string[] args)
{
Thingy thingy = new Thingy();
Widget widget = new Widget();
thingy.Action();
widget.Action();
Console.Out.WriteLine("Press any key to quit.");
Console.ReadKey();
}
}
Когда вы запустите Программу, ваш вывод будет:
Zing
A Thingy in Action.
Wiggy
A Thingy in Action.
Обратите внимание, что, хотя Widget вызывал метод Action (), определенный на уровне Thingy, внутренне Thingy вызывал метод Widget StepA ().
Основной ответ - это дает наследникам класса больше гибкости. Конечно, вы должны хорошо спроектировать свой класс, иначе это может привести к слабым последствиям.