Виртуальные функции были в C++ с самого начала как средство динамического полиморфизма. Однако, раньше не существовало синтаксического механизма, который бы заставлял компилятор проверять корректность переопределения виртуальных функций в производных классах. После появления C++11 ключевое слово override стало инструментом дополнительной компиляторной проверки.
Без override компилятор не гарантирует, что функция действительно переопределяет метод базового класса. Ошибки в сигнатуре (например, неправильный тип или const) приводят к созданию новой функции в производном классе («затенению»), что ломает полиморфизм и затрудняет отладку.
Использование override при объявлении виртуальной функции в производном классе позволяет компилятору проверить, что сигнатура в точности совпадает с виртуальной функцией-родителем, и функция действительно переопределяет родительскую. В противном случае компиляция прерывается ошибкой.
Пример кода:
struct Base { virtual void foo() const {} }; struct Derived : Base { void foo() const override { /* реализация */ } };
Если в Derived написать void foo() без const override, компилятор выдаст ошибку.
Ключевые особенности:
Можно ли оставить виртуальную функцию с ключевым словом 'override', но без key word 'virtual'?
Да, override подразумевает, что функция виртуальна. Указывать virtual вместе с override избыточно, но не запрещено.
Возможна ли ошибка, если функция отличается только по модификатору const или ref qualifier (например, & или &&)?
Да, любые отличия в сигнатуре, в том числе по const/references, ломают переопределение. Например, void foo() override не переопределяет void foo() const, и компилятор благодаря override это отловит.
Можно ли применять 'override' к статическим функциям или конструкторам?
Нет. override только для виртуальных функций, нельзя применять к статическим функциям, конструкторам, деструкторам (если они не виртуальные).
В большом проекте у класса-наследника опечатка в сигнатуре функции: функция по факту не override, но разработчик считает иначе, полиморфизм не работает как ожидается.
Плюсы:
Минусы:
Во всех производных классах используется override, тесты ловят ошибки уже на этапе сборки.
Плюсы:
Минусы: