Стиль C++: Добавление префикса виртуального ключевого слова к переопределенным методам

Обновление xserver-xorg-input-synaptics пакета от точно предложенного должно устранить Вашу проблему.

Для получения дополнительной информации проверка https://bugs.launchpad.net/bugs/982771 (комментарий № 6 для точно предложенного включения).

https://wiki.ubuntu.com/Testing/EnableProposed

25
задан Kara 28 June 2013 в 23:50
поделиться

5 ответов

Я полностью согласен с вашим обоснованием. Это хорошее напоминание о том, что при вызове метода будет использоваться семантика динамической отправки. Аргумент «этот метод не виртуальный», который использует ваш коллега, является полностью надуманным. Он смешал понятия виртуального и чисто-виртуального.

23
ответ дан 28 November 2019 в 21:28
поделиться

Добавление виртуального не оказывает значительного влияния. Я предпочитаю это, но это действительно субъективный вопрос. Однако, если вы обязательно используете ключевые слова override и sealed в Visual C ++ , вы значительно улучшите способность обнаруживать ошибки во время компиляции.

Я включаю в свой PCH следующие строки:

#if _MSC_VER >= 1400
#define OVERRIDE override
#define SEALED sealed
#else
#define OVERRIDE
#define SEALED
#endif
4
ответ дан 28 November 2019 в 21:28
поделиться

. Я бы не стал использовать какой-либо синтаксис, который компилятор позволяет мне опустить. При этом часть дизайна C # (в попытке улучшить по сравнению с C ++) заключалась в том, чтобы требовать, чтобы переопределения виртуальных методов были помечены как «переопределение», и это кажется разумной идеей. Меня беспокоит то, что, поскольку это совершенно необязательно, это только вопрос времени, когда кто-то его пропустит, и к тому времени у вас появится привычка ожидать, что переопределения будут указаны "виртуально". Может быть, тогда лучше просто жить в рамках ограничений языка.

Часть дизайна C # (в попытке улучшить по сравнению с C ++) заключалась в том, чтобы требовать, чтобы переопределения виртуальных методов были помечены как «переопределение», и это кажется разумной идеей. Меня беспокоит то, что, поскольку это совершенно необязательно, это только вопрос времени, когда кто-то его пропустит, и к тому времени у вас появится привычка ожидать, что переопределения будут указаны "виртуально". Может быть, тогда лучше просто жить в рамках ограничений языка.

Часть дизайна C # (в попытке улучшить по сравнению с C ++) заключалась в том, чтобы требовать, чтобы переопределения виртуальных методов были помечены как «переопределение», и это кажется разумной идеей. Меня беспокоит то, что, поскольку это совершенно необязательно, это только вопрос времени, когда кто-то его пропустит, и к тому времени у вас появится привычка ожидать, что переопределения будут указаны "виртуально". Может быть, тогда лучше просто жить в рамках ограничений языка.

3
ответ дан 28 November 2019 в 21:28
поделиться

Функция, которая когда-то была виртуальной, всегда была виртуальной .

Таким образом, в любом случае, если ключевое слово virtual не используется в последующих классах, это не препятствует тому, чтобы функция / метод были виртуальными. 'т.е. быть переопределенным. Итак, один из проектов, над которым я работал, содержал следующие рекомендации, которые мне отчасти понравились:

  • Если функция / метод должны быть переопределенным всегда используйте ключевое слово virtual. Это особенно истина при использовании в интерфейсе / базе классы.
  • Если производный класс должен быть подклассом дальнейшей ясности укажите "виртуальное" ключевое слово для каждого функция / метод, который может быть переопределено. C ++ 11 использует ключевое слово override
  • Если функция / метод в производном класс не должен быть снова подкласс, затем ключевое слово 'виртуальный' следует прокомментировать указывая, что функция / метод было отменено, но нет другие классы, которые его отменяют еще раз. Это, конечно, не мешает кто-то из производный класс, если класс делается окончательным (невыводимым), но это указывает, что метод не должен быть переопределено. Пример: / * виртуальный * / void guiFocusEvent (); C ++ 11 используйте ключевое слово final вместе с ключевым словом override Пример: void guiFocusEvent () override final;
6
ответ дан 28 November 2019 в 21:28
поделиться

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

0
ответ дан 28 November 2019 в 21:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: