- Да, они одинаковы. Производный класс, не объявляющий что-то виртуальное, не мешает ему быть виртуальным. Фактически, нет никакого способа остановить любой метод (включая деструктор), чтобы он был виртуальным в производном классе, если он был виртуальным в базовом классе. В> = C ++ 11 вы можете использовать
final
для предотвращения его переопределения в производных классах, но это не мешает ему быть виртуальным.
- Да, деструктор в производном классе может быть опущен, если он не имеет ничего общего. И не имеет значения, виртуальный он или нет.
- Я бы пропустил это, если это возможно. И для ясности я всегда снова использую ключевое слово
virtual
для виртуальных функций в производных классах. Людям не нужно идти вверх по иерархии наследования, чтобы понять, что функция является виртуальной. Кроме того, если ваш класс является копируемым или перемещаемым без необходимости объявлять собственную копию или перемещать конструкторы, объявление деструктора любого типа (даже если вы определите его как default
) заставит вас объявить конструкторы копирования и перемещения и операторы присваивания если вы хотите их, так как компилятор больше не вставит их для вас.
В качестве небольшого замечания по пункту 3. В комментариях было отмечено, что, если деструктор не объявлен, компилятор генерирует объект по умолчанию (который все еще является виртуальным). И эта по умолчанию является встроенной функцией.
Встроенные функции потенциально подвергают большую часть вашей программы изменениям в других частях вашей программы и затрудняют двоичную совместимость для разделяемых библиотек. Кроме того, повышенная связь может привести к большой перекомпиляции перед лицом определенных изменений. Например, если вы решите, что действительно хотите реализовать реализацию для своего виртуального деструктора, то каждый фрагмент кода, который его вызвал, необходимо будет перекомпилировать. Принимая во внимание, что если бы вы объявили его в теле класса, а затем определили его пустым в файле .cpp
, вы могли бы изменить его без перекомпиляции.
Мой личный выбор все равно будет опускать его, когда это возможно. По моему мнению, это загромождает код, и компилятор может иногда делать немного более эффективные вещи с реализацией по умолчанию над пустой. Но есть ограничения, из-за которых вы можете оказаться плохим выбором.