Виртуальные методы следует использовать, если вы хотите обеспечить поведение по умолчанию в базовом классе. Дочерние классы могут затем переопределить эту функцию и обеспечить свое собственное, более конкретное поведение.
Например:
class Animal
{
public virtual void Say()
{
//default behaviour
Console.WriteLine("Animal makes generic noise");
}
}
class Dog : Animal
{
public override void Say()
{
//specific behaviour
Console.WriteLine("Dog barks.");
}
}