переопределить не виртуальные функции - PullRequest
29 голосов
/ 23 сентября 2011

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

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

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

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

Ответы [ 3 ]

28 голосов
/ 23 сентября 2011

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

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

0 голосов
/ 23 сентября 2011

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

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

0 голосов
/ 23 сентября 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...