Является ли ключевое слово ‘override’ просто проверкой переопределенного виртуального метода?

Насколько я понимаю, введение ключевого слова override в C ++ 11 является не чем иным, как проверкой, чтобы убедиться, что реализуемая функция является override virtual функции в базовом classе.

Это оно?

Это действительно идея. Дело в том, что вы явно говорите о том, что вы имеете в виду, чтобы можно было диагностировать в противном случае тихую ошибку:

 struct Base { virtual int foo() const; }; struct Derived : Base { virtual int foo() // whoops! { // ... } }; 

Вышеупомянутый код компилируется, но это не то, что вы, возможно, имели в виду (обратите внимание на отсутствующую const ). Если вы сказали вместо этого, virtual int foo() override , то вы получите ошибку компилятора, что ваша функция на самом деле не отменяет ничего.

Википедия:

Специальный идентификатор переопределения означает, что компилятор проверяет базовый class (ы), чтобы увидеть, есть ли виртуальная функция с этой точной подписью. И если этого не произойдет, компилятор выйдет из строя.

http://en.wikipedia.org/wiki/C%2B%2B11#Explicit_overrides_and_final

Изменить (попытка немного улучшить ответ):

Объявление метода как «переопределения» означает, что этот метод предназначен для перезаписи (виртуального) метода в базовом classе. Метод переопределения должен иметь одну и ту же подпись (по крайней мере, для входных параметров) как метод, который он намеревается переписать.

Почему это необходимо? Ну, предотвращаются следующие два распространенных случая ошибок:

  1. один тип типа в новом методе. Компилятор, не подозревая, что он намеревается написать предыдущий метод, просто добавляет его в class как новый метод. Проблема в том, что старый метод все еще существует, новый добавляется как перегрузка. В этом случае все обращения к старому методу будут действовать так же, как и раньше, без каких-либо изменений в поведении (что было бы самой целью перезаписи).

  2. один забывает объявить метод в суперclassе как «виртуальный», но все же пытается перезаписать его в подclassе. Хотя это, по-видимому, будет принято, поведение будет не таким, как предполагалось: метод не является виртуальным, поэтому доступ через указатели к суперclassу приведет к вызову старого метода (суперclass) вместо нового (подclassа).

Добавление «переопределения» явно устраняет это: через это сообщается компилятору, что три вещи ожидают:

  1. в суперclassе есть метод с тем же именем
  2. этот метод в суперclassе объявлен как «виртуальный» (это означает, что он должен быть переписан)
  3. метод в суперclassе имеет такую ​​же (входную) подпись как метод в подclassе (метод перезаписи)

Если какое-либо из них является ложным, то сигнализируется ошибка.

* note: выходной параметр иногда отличается от другого, но связан с ним. Прочтите о ковариантных и контравариантных преобразованиях, если они заинтересованы.

Найденное « переопределение » полезно, когда кто-то обновил подпись виртуального метода базового classа, например добавление необязательного параметра, но забыл обновить сигнатуру метода производного classа. В этом случае методы между базой и производным classом уже не являются полиморфными. Без объявления переопределения трудно найти такую ​​ошибку.

Да, это так. Это проверка, чтобы убедиться, что вы не пытаетесь переопределить и испортить ее через поврежденную подпись. Вот страница Wiki, которая подробно объясняет это и имеет короткий иллюстративный пример:

http://en.wikipedia.org/wiki/C%2B%2B11#Explicit_overrides_and_final

  • C ++ «виртуальное» ключевое слово для функций в производных classах. Это необходимо?
  • Interesting Posts
    Давайте будем гением компьютера.