Каждый класс должен иметь виртуальный деструктор?

49
задан Community 23 May 2017 в 00:31
поделиться

7 ответов

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

Или Вам нужен компилятор для броска серьезной ошибки, если кто-либо смеет делать что-то, что Вы не ожидали?

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

28
ответ дан jalf 7 November 2019 в 11:41
поделиться

Каждый абстрактный класс должен или иметь a,

  • защищенный деструктор, или,
  • виртуальный деструктор.

, Если у Вас есть общедоступный невиртуальный деструктор, это бесполезно, так как он позволяет пользователям удалять через тот указатель производный объект. С тех пор, как все мы знаем, это - неопределенное поведение.

Для класса, не предназначенного для удаления через указатель на него нет никакой причины вообще для имения виртуального деструктора. Это не только потратило бы впустую ресурсы, но что еще более важно это даст пользователям неправильную подсказку. Просто думайте, о каком дрянном смысле это имело бы для предоставления std::iterator виртуальный деструктор.

54
ответ дан Sam 7 November 2019 в 11:41
поделиться

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

8
ответ дан Nemanja Trifunovic 7 November 2019 в 11:41
поделиться

Проверьте эта статья от Herb Sutter :

Инструкция № 4: деструктор базового класса должен быть или общедоступным и виртуальным, или защищенный и невиртуальным.

4
ответ дан Paolo Tedesco 7 November 2019 в 11:41
поделиться

Я был бы "нет" к общему вопросу. Не каждый классу нужен тот. Если можно знать, что класс никогда не должен быть наследован от, то нет никакой потребности подвергнуться незначительным издержкам. Но если существует шанс, быть на безопасной стороне и поместить ту там.

2
ответ дан Evan Teran 7 November 2019 в 11:41
поделиться

Я добавлю, что были времена, когда я поцарапал голову некоторое время на деструкторах, не позвонившись, когда я забыл виртуальное в родительском или дочернем классе. Я предполагаю, что знаю для поиска этого теперь все же.:)

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

0
ответ дан Patrick Hogan 7 November 2019 в 11:41
поделиться

Базовый класс становится абстрактным, если он содержит хотя бы одну чистую виртуальную функцию. Если у Base нет виртуального деструктора, а у Derived (производного от Base) есть, то вы можете безопасно уничтожить производный объект с помощью указателя на производный объект, но не с помощью указателя на объект Base.

1
ответ дан 7 November 2019 в 11:41
поделиться
Другие вопросы по тегам:

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