TGViewer
Грокаем C++ Грокаем C++ @grokaemcpp · 9.35K subscribers
Post #271 3.86K
Идентификатор override

В статье про динамический полиморфизм мы затронули вопрос переопределения виртуальных методов. Напомню: если сигнатура виртуального метода наследника будет отличаться от сигнатуры метода родителя, то может нарушиться работа динамического полиморфизма. Если вы хотели переопределить метод, но ошиблись с сигнатурой, то будет создан новый метод. К нему нельзя получить доступ через общий интерфейс!

Может быть вы это специально задумали, может быть вы ошиблись - компилятор не знает, что именно произошло. С его точки зрения и то, и другое - возможное корректное поведение программы, что зависит только от замысла разработчика.

Вот чтобы разделять эти два состояния, переопределяемые виртуальные методы в наследниках нужно отмечать идентификатором override:
struct Child : public Parent
{
// Переопределяем виртуальный метод
// Parent::say_name
virtual void say_name() override
};

Так мы не только явно выражаем наше намерение для других разработчиков, но и просим компилятор проверить нас. Если по каким-то причинам нарушается правило переопределения родительского виртуального метода, то это приведёт к ошибке компиляции. Мы рекомендуем это делать в строго обязательном порядке!

В противном случае, у компилятора просто нет никаких других критериев, по которым мы можем однозначно утверждать переопределяем мы метод или нет. В живом примере продемонстрировал, что вызов ошибочно переопределенного метода не привел к вызову другой реализации.

Кажется, что проблема надуманная, но практически в любом рабочем проекте это будет запутывать. Этого стараются избегать любой ценой, и про это не упустят возможность спросить на собеседовании :) Тем не менее, иногда такое можно встретить. Например, при просмотре кода 20-летней давности. Идентификатор override появился в C++11, а до этого писали без него. И вот тут придется потратить время, чтобы распутать клубок переопределений. Особенно остро этот вопрос встаёт, когда в наследниках так же не указывается ключевое слово virtual, что допускается стандартом. В шутку сделал вам игру лабиринт, в которой надо найти неправильно переопределенный метод.

Напоминать о необходимости override можно с помощью предупреждения:
-Wsuggest-override

#cppcore
  • 👍 23
  • ❤ 7
  • ❤‍🔥 4
  • ⚡ 2
  • 🔥 1
More from @grokaemcpp
  1. Oct 14, 2026​​Что внутри std::condition_variable? #опытным Более менее все знакомы с примитивом синхро…
  2. Oct 12, 2026​​WAT #новичкам Как вы думаете, результат выражения: bool math = -1 < 1U; будет правдой ил…
  3. Oct 8, 2026​​Strict weak ordering #опытным На первый взгляд, всё выглядит рабочим: мы создаём 40 зака…
  4. Oct 7, 2026​​Где-то баг... #опытным Вот вам код: struct Order { int price; int id; }; int main() { st…
  5. Oct 5, 2026Откуда spurious wakeup на кондваре? #опытным У кондваров есть метод std::condition_variabl…
  6. Oct 1, 2026​​Stacktrace. Tips #опытным Чтобы полноценно работать со стандартными трейсами, нужно знат…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →