Модификатор virtual используется для изменения объявлений методов, свойств, индексаторов и событий и разрешения их переопределения в производном классе. В переводе на понятный язык, это означает что методы уже реализованы, но если их реализация не нравится, то их можно переопределить, сделав свою реализацию.
В отличие от абстрактных методов, виртуальные методы уже содержат реализацию, которую можно использовать в наследуемых классах.
Модификатор virtual нельзя использовать с модификаторами static, abstract, private или override.
В примере ниже приведено использование виртуального метода.
Как видно, в наследуемом классе метод не определен, а используется напрямую в классе Program.
abstract class Car { abstract public void drive(); abstract public int Wheels { get; set; } public virtual double Square(int x, int y) { return x * y; } } class Opel : Car { int _wheels; public override int Wheels { get { return _wheels ; } set { _wheels = value; } } public override void drive() { // Console.WriteLine(_wheels); } } class Program { static void Main() { Opel myOpel = new Opel(); myOpel.Wheels = 4; myOpel.drive(); double sq = myOpel.Square(myOpel.Wheels, myOpel.Wheels); Console.WriteLine("Колес в квадрате будет: " + sq); } }