Приведем пример: у нас есть базовый класс Animals, два дочерних класса Tiger, Elephant. В базовом классе определен метод Feed, который используется для двух объектов дочерних классов:



Однако, тигр и слон едят разную еду и по этому есть необходимость сделать так, чтобы на консоль для двух дочерних классов выводился соответствующе разный текст. Для этого используется ключеове слово virtual при объявлении метода в базовом классе – это дает возможность дочернему классу переопределить метод с помощью ключевого слова override («переопределять, перезаписывать»).


Base ставится автоматически и означает, что сначала выполнятся все инструкции, определенные в этом же методе в базовом классе, а потом уже то, что мы допишем. Можно вообще убрать данную строку при желании.




Важно: виртуальный метод не заставляет нас переопределять методы, мы можем сделать это, если захотим. Если мы не переопределим метод в классе Elephant например, то просто выполнится метод, который задан в базовом классе.