Какую проблему решает ключевое слово override в C++?

«Какую проблему решает ключевое слово override в C++?» — вопрос из категории ООП, который задают на 25% собеседований C/C++ Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Ключевое слово override решает проблему неявных ошибок при переопределении виртуальных функций. Оно заставляет компилятор проверять, что метод в производном классе действительно переопределяет виртуальный метод из базового класса, а не создает новый, независимый метод из-за опечатки или несовпадения сигнатуры.

Пример проблемы, которую оно предотвращает:

class Base {
public:
    virtual void process() const;
    virtual int calculate(int x);
};

class Derived : public Base {
public:
    // Опечатка: 'proccess' вместо 'process'. Без 'override' это новый метод, ошибка молчаливая.
    virtual void proccess() const; 
    // Несовпадение сигнатуры: пропущен const. Без 'override' это тоже новый метод.
    virtual void process(); 
};

Решение с override:

class Derived : public Base {
public:
    void process() const override; // OK: компилятор проверяет соответствие с Base::process()
    // void proccess() const override; // Ошибка компиляции: метод не найден в базовом классе
    // void process() override;        // Ошибка компиляции: сигнатура не совпадает (отсутствует const)
};

Преимущества:

  • Безопасность: Ошибки обнаруживаются на этапе компиляции.
  • Ясность намерений: Код явно сообщает, что метод является переопределением.
  • Упрощение рефакторинга: При изменении сигнатуры в базовом классе компилятор укажет на все места, где переопределение стало некорректным.