С ++ 11 FDIS это говорит
Если виртуальная функция помечена переопределением virt-спецификатора и не переопределяет функцию-член
базовый класс, программа плохо сформирована. [Пример:
struct B {
virtual void f(int);
};
struct D : B {
void f(long) override; // error: wrong signature overriding B::f
void f(int) override; // OK
};
Что, если B::f
не был бы помечен как виртуальный? В таком случае программа плохо сформирована? Или override
тогда игнорировать`. Я не могу найти обработки этого случая в тексте STD.
Обновление 1/2 (объединено) Я направил запрос в редакторы C ++, чтобы разобраться. Спасибо Йоханнес за то, что указал мне на это.
- "void f (long) override" не переопределяет функцию, особенно нет виртуального,
- поэтому он не виртуальный
- поэтому текст "Если виртуальная функция помечена ..." не применяется
- поэтому пример не соответствует тексту.
Но, поняв это, я обнаружил, что цель контекстного ключевого слова «переопределить» не может быть достигнута: если опечатка в имени функции или неправильный тип аргумента делает саму функцию не виртуальной, то текст стандарта никогда не применяется - и «переопределение» становится бесполезным.
Лучшее возможное решение может быть
- ставит "виртуальный" перед функциями примера