# 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
    };