Вопрос действительно, Вы хотите к , осуществляют правила о том, как Ваши классы должны использоваться? Почему? Если класс не имеет виртуального деструктора, любой использующий класс знает, что это не предназначается, чтобы быть полученным из, и что ограничения применяют при попытке его так или иначе. Это не достаточно хорошо?
Или Вам нужен компилятор для броска серьезной ошибки, если кто-либо смеет делать что-то, что Вы не ожидали?
Дают классу виртуальный деструктор, если Вы намереваетесь для людей произойти из него. Иначе не делайте и предполагайте, что любой использующий Ваш код достаточно умен для использования кода правильно.
Каждый абстрактный класс должен или иметь a,
, Если у Вас есть общедоступный невиртуальный деструктор, это бесполезно, так как он позволяет пользователям удалять через тот указатель производный объект. С тех пор, как все мы знаем, это - неопределенное поведение.
Для класса, не предназначенного для удаления через указатель на него нет никакой причины вообще для имения виртуального деструктора. Это не только потратило бы впустую ресурсы, но что еще более важно это даст пользователям неправильную подсказку. Просто думайте, о каком дрянном смысле это имело бы для предоставления std::iterator
виртуальный деструктор.
Нет! Виртуальные деструкторы используются только, когда объект производного класса удален через указатель базового класса. Если Ваш класс не предназначается для служения в качестве основы в этом сценарии, не делайте деструктор виртуальным - Вы отправили бы неправильное сообщение.
Проверьте эта статья от Herb Sutter :
Инструкция № 4: деструктор базового класса должен быть или общедоступным и виртуальным, или защищенный и невиртуальным.
Я был бы "нет" к общему вопросу. Не каждый классу нужен тот. Если можно знать, что класс никогда не должен быть наследован от, то нет никакой потребности подвергнуться незначительным издержкам. Но если существует шанс, быть на безопасной стороне и поместить ту там.
Я добавлю, что были времена, когда я поцарапал голову некоторое время на деструкторах, не позвонившись, когда я забыл виртуальное в родительском или дочернем классе. Я предполагаю, что знаю для поиска этого теперь все же.:)
Кто-то мог бы утверждать, что существуют времена, родительский класс делает что-то в своем деструкторе, который ребенок не должен делать..., но это - вероятно, индикатор чего-то не так с Вашей структурой наследования так или иначе.
Базовый класс становится абстрактным, если он содержит хотя бы одну чистую виртуальную функцию. Если у Base нет виртуального деструктора, а у Derived (производного от Base) есть, то вы можете безопасно уничтожить производный объект с помощью указателя на производный объект, но не с помощью указателя на объект Base.