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