Согласно Википедии, виртуальный метод (виртуальная функция) в объектно-ориентированном программировании — это метод (функция) класса, который может быть переопределён в классах-наследниках так, что конкретная реализация метода для вызова будет определяться во время исполнения. Таким образом, программисту необязательно знать точный тип объекта для работы с ним через виртуальные методы: достаточно лишь знать, что объект принадлежит классу или наследнику класса, в котором объявлен метод. ([Источник](https://ru.wikipedia.org/wiki/Виртуальный_метод).)

Виртуальные функции реализуют базовый принцип ООП — полиморфизм, — согласно которому, поведение объекта определяется его конкретным типом, а не типом переменной, с помощью которой программист обращается к нему. Например, в базовом классе `Cow` может быть определён метод `say`, который всегда возвращает строку `"moo"`, а в дочернем классе `AICow` этот метод может быть переопределён, возвращая мудрые высказывания. Тогда в программе может быть массив объектов `Cow`, при обращении к разным элементам которого вы будете получать либо «му», либо что-то более разумное, в зависимости от того, на какую корову нарвались.

А ещё есть мои любимые «чисто виртуальные» (*pure virtual*) функции. Такая функция объявляется в базовом классе, но не имеет в нём реализации. Реализацию чисто виртуальных функций должны предоставлять классы-потомки. Например, базовый класс `Shape`, реализующий абстракцию геометрической фигуры, может иметь метод `draw`, рисующий фигуру на экране. Однако абстрактную фигуру нарисовать проблематично, потому этот метод, скорее всего, будет чисто виртуальным, а реализовывать его будут потомки: `Line`, `Rectangle`, `Circle` и т. п.
spam fails_task lang_mismatch pii not_appropriate hate_speech sexual_content quality toxicity humor helpfulness creativity violence