V2023. Absence of the 'override' specifier when overriding a virtual function may cause a mismatch of signatures.
Диагностическое правило добавлено по просьбе пользователей.
Правило предназначено для выявления всех случаев переопределения виртуальных функций базового класса без использования спецификатора override.
Примечание N1. Для поиска только некорректных переопределений виртуальных функций следует использовать диагностическое правило V762.
Примечание N2. Диагностическое правило актуально только для языка C++.
Хотя отсутствие спецификатора override не является ошибкой, оно лишает разработчика и компилятор важной защиты. Без него нет гарантии, что сигнатура функции действительно совпадает с виртуальной функцией базового класса. В таком случае переопределения не происходит, что может привести к логическим ошибкам и непредсказуемому поведению.
Явное указание override устраняет эту проблему, позволяя компилятору проверить корректность переопределения, тем самым предотвращая возможные ошибки.
Допустим, существует следующий базовый класс:
class Base
{
public:
virtual void one();
virtual void two(int);
};
От него наследуется следующий класс:
class Derived : public Base
{
public:
virtual void one();
virtual void two(); // 'Derived::two' hides 'Base::two'
// there might be runtime failure
};
В данном варианте не используется спецификатор override, а значит, компилятор не выдаст ошибку этапа компиляции при несовпадении сигнатур функций two.
Пример исправленного кода с использованием override:
class Derived : public Base
{
virtual void one() override;
virtual void two() override; // compile-time error:
// 'Derived::two' doesn't override
// any base class virtual functions
};