Должен ли я пометить мои деструкторы производного класса виртуальными / переопределить? - PullRequest
0 голосов
/ 15 мая 2018

Основные рекомендации C ++ содержат следующий совет относительно спецификаторов virtual, override и final, конкретно относящихся к деструкторам производного класса:

Еслидеструктор базового класса объявлен виртуальным, следует избегать объявления деструкторов производного класса виртуальными или переопределенными.Некоторые кодовые базы и инструменты могут настаивать на переопределении для деструкторов, но это не рекомендация этих рекомендаций.

Конечно, clang-tidy является одним из тех инструментов, которые идут вразрез с рекомендациями.Если я не укажу virtual или override, то при запуске clang-tidy выдается следующее предупреждение:

warning: annotate this function with 'override' or (rarely) 'final' [modernize-use-override]

или, если указано просто virtual:

warning: prefer using 'override' or (rarely) 'final' instead of 'virtual' [modernize-use-override]

Мой вопрос

Учитывая, что указание override, в частности, имеет преимущество (по крайней мере), если вы правильно указали деструктор базового класса как virtual, мой вопрос сводится к следующим конкретным частям:

  1. Каковы, если таковые имеются, аргументы в пользу , а не , указывающего virtual или override на деструкторы производного класса?
  2. По вашему мнениюследует ли мне больше склоняться к рекомендации clang-tidy или к рекомендации по основным рекомендациям C ++?

1 Ответ

0 голосов
/ 15 мая 2018
  1. Каковы аргументы в пользу не указания ... override на деструкторы производного класса?

Существуют несовместимые компиляторы, которые не могут скомпилироваться, если для деструктора задано override: https://msdn.microsoft.com/en-us/library/xfzxhe2a.aspx.

  1. Каковы аргументы в пользу не указания virtual ... на деструкторы производного класса [когда он неявно виртуален]?

Чем меньше кода, тем лучше. Вы экономите 7 символов, не используя избыточные virtual.

  • Аргумент счетчика: 7 символов - не слишком большая экономия.

Возможно, будет принято проектное решение сделать ранее виртуальный деструктор не виртуальным для базового класса и всех его дочерних элементов. Если строго следовать этому руководству (не указывать избыточность virtual), необходимо изменить только базу. В противном случае каждый дочерний элемент в иерархии должен быть изменен (или, по крайней мере, проверен, указывают ли они virtual отдельно).

  • Встречный аргумент: это может быть совершенно гипотетическая ситуация. Конечно, довольно редко.

  1. Как вы думаете, стоит ли мне больше склоняться к совету о лягушке или к руководству по основным рекомендациям C ++?

Единственный аргумент, который, по моему мнению, имеет существенный вес, - это несоответствие старых компиляторов Visual Studio, и поэтому я бы ошибался из-за того, что не использовал override для деструкторов. В противном случае это очень мало значит, и вы можете следовать тому руководству, которое вы предпочитаете, или даже не беспокоиться о его соблюдении - последовательность не важна, когда под рукой нет разницы.

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