Ответ 1
Когда вы переопределяете функцию, вам технически не нужно писать либо virtual
, либо override
.
В исходном объявлении базового класса требуется ключевое слово virtual
, чтобы пометить его как виртуальное.
В производном классе функция является виртуальной с помощью того же типа, что и функция базового класса.
Однако override
может помочь избежать ошибок, вызвав ошибку компиляции, когда предполагаемое переопределение не является технически переопределяющим. Например. что тип функции не совсем похож на функцию базового класса. Или что поддержание базового класса изменяет тип функции, например. добавление аргумента по умолчанию.
Таким же образом ключевое слово virtual
в производном классе может сделать такую ошибку более тонкой, гарантируя, что функция все еще является виртуальной в следующих производных классах.
Итак, общий совет:
-
Используйте
virtual
для объявления функции базового класса.
Это технически необходимо. -
Используйте
override
(только) для переопределения производного класса.
Это помогает в обслуживании.
Пример:
struct Base { virtual void foo() {} };
struct Derived: Base { void foo() override {} };
Примечания:
¹ С++ поддерживает ковариантный необработанный указатель и исходные ссылочные результаты. С ковариацией тип переопределения не совсем то же самое. Он имеет совместимый тип.