Подтвердить что ты не робот

Переопределить не виртуальные функции

В С++ 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" не отменяет функцию, особенно. нет виртуального,
  • поэтому он не является виртуальным
  • поэтому текст "Если виртуальная функция отмечена..." не применяется
  • поэтому пример не соответствует тексту.

Но, осознав это, я обнаружил, что намерение "переопределить" контекстное ключевое слово не может быть выполнено: если опечатка в имени функции или неправильном типе аргументов делает эту функцию не виртуальной, тогда стандартный текст никогда не применяется - и "переопределение" оказывается бесполезным.

Лучшим возможным решением может быть

  • установка "виртуального" перед примерными функциями
4b9b3361

Ответ 1

Что делать, если B::f не было помечено как виртуальное? Является ли программа плохо сформированной, то?

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

Ответ 2

Если B:f был не виртуальным, то обе функции D:f были бы плохо сформированы.

Ответ 3

Да, программа плохо сформирована, когда override добавляется к любой не виртуальной функции.

Как правило, функции с разными сигнатурами (перегруженными) различаются как функции с разными именами. Пример, приведенный в Spec, не означает, что имя функции действует override. Это означало показать общую ошибку, которую предотвращает override.