﻿# V2023\. Absence of the 'override' specifier when overriding a virtual function may cause a mismatch of signatures\.

Диагностическое правило добавлено по просьбе пользователей\.

Правило предназначено для выявления всех случаев переопределения виртуальных функций базового класса без использования спецификатора override\.

**Примечание N1**\. Для поиска только некорректных переопределений виртуальных функций следует использовать диагностическое правило [V762](https://pvs-studio.ru/ru/docs/warnings/v762/)\.

**Примечание N2**\. Диагностическое правило актуально только для языка C\+\+\.

Хотя отсутствие спецификатора `override` не является ошибкой, оно лишает разработчика и компилятор важной защиты\. Без него нет гарантии, что сигнатура функции действительно совпадает с виртуальной функцией базового класса\. В таком случае переопределения не происходит, что может привести к логическим ошибкам и непредсказуемому поведению\.

Явное указание `override` устраняет эту проблему, позволяя компилятору проверить корректность переопределения, тем самым предотвращая возможные ошибки\.

Допустим, существует следующий базовый класс:

```cpp
class Base
{
public:
  virtual void one();
  virtual void two(int);
};
```

От него наследуется следующий класс:

```cpp
class Derived : public Base
{
public:
  virtual void one();
  virtual void two(); // 'Derived::two' hides 'Base::two'
                      // there might be runtime failure
};
```

В данном варианте не используется спецификатор `override`, а значит, компилятор не выдаст ошибку этапа компиляции при несовпадении сигнатур функций `two`\.

Пример исправленного кода с использованием `override`:

```cpp
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
};
```