Java и C # поддерживают понятие классов, которые нельзя использовать в качестве базовых классов с ключевыми словами final
и sealed
. В C ++, однако, нет хорошего способа предотвратить создание класса, что ставит автора класса перед дилеммой: должен ли каждый класс иметь виртуальный деструктор или нет?
Изменить: Поскольку C ++ 11 больше не соответствует действительности, вы можете указать, что класс _ 3_.
С одной стороны, предоставление объекту виртуального деструктора означает, что он будет иметь vtable
и, следовательно, потреблять 4 (или 8 на 64-битных машинах) дополнительных байта на объект для vptr
.
С другой стороны, если кто-то позже унаследует этот класс и удалит производный класс с помощью указателя на базовый класс, программа будет некорректно определена (из-за отсутствия виртуального деструктора), и откровенно оптимизация указателя для каждого объекта будет нелепый.
В gripping hand виртуальный деструктор (возможно) рекламирует, что этот тип предназначен для полиморфного использования. .
Некоторые люди думают, что вам нужна явная причина не использовать виртуальный деструктор (как подтекст этого вопроса), а другие говорят, что вы следует использовать их только тогда, когда у вас есть основания полагать, что ваш класс должен быть производным от, что вы думаете?