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