Переопределить не виртуальные функции
В С++ 11 FDIS говорится:
Если виртуальная функция отмечена переопределением virt-specifier и не переопределяет функцию-член базовый класс, программа плохо сформирована. [Пример:
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 (объединено) Я отправил запрос редакторам С++ для изучения вещей. Спасибо, Йоханнес, чтобы указать на это.
- "void f (long) override" не отменяет функцию, особенно. нет виртуального,
- поэтому он не является виртуальным
- поэтому текст "Если виртуальная функция отмечена..." не применяется
- поэтому пример не соответствует тексту.
Но, осознав это, я обнаружил, что намерение "переопределить" контекстное ключевое слово не может быть выполнено: если опечатка в имени функции или неправильном типе аргументов делает эту функцию не виртуальной, тогда стандартный текст никогда не применяется - и "переопределение" оказывается бесполезным.
Лучшим возможным решением может быть
- установка "виртуального" перед примерными функциями
Ответы
Ответ 1
Что делать, если B::f
не было помечено как виртуальное? Является ли программа плохо сформированной, то?
Да, это так. Потому что для переопределить что-то, что должно быть виртуальным. В противном случае он не переопределяет, он скрывает. Итак, положительный ответ следует из цитаты в вашем вопросе.
Ответ 2
Если B:f
был не виртуальным, то обе функции D:f
были бы плохо сформированы.
Ответ 3
Да, программа плохо сформирована, когда override
добавляется к любой не виртуальной функции.
Как правило, функции с разными сигнатурами (перегруженными) различаются как функции с разными именами. Пример, приведенный в Spec, не означает, что имя функции действует override
. Это означало показать общую ошибку, которую предотвращает override
.