I think virtual alone is generally sufficient.
Is there another reason to make it pure virtual than to force derived classes to implement their own destructor? I mean if you allocate something in your class' constructor you should impement your own destructor - if your class is derived or not.
Doesn't count as answer as I already know: If you want your class abstract and it has no pure virtual functions - leave it to the destructor.
Some more uses?
Если вы хотите, чтобы ваш класс был абстрактным, и он не имеет чисто виртуальных функций - оставь это деструктору.
На самом деле, я не думаю, что есть еще кое-что. Все, что делает чистый виртуальный деструктор, делает весь класс абстрактным. Вы должны предоставить реализацию для чистого виртуального деструктора, а также для виртуального деструктора, не являющегося чистым, деструкторы производных классов являются виртуальными только с виртуальным деструктором и т. Д.
В принципе, если класс уже имеет некоторую чистую виртуальную функции, его поведение будет эквивалентно виртуальному и чисто виртуальному деструктору.
Нет. Если базовый класс что-то выделяет, он обязан освободить это.
Кроме того, если производный класс ничего не выделяет, нет смысла заставлять их писать фиктивный dtor.
Если ваш абстрактный класс представляет собой чистый интерфейс без элементов данных, вы могли бы обойтись с созданием виртуального dtor. Я сам предпочитаю это, так как я видел, как очень много горячих программистов вообще забывают создать виртуальный деструктор: даже когда они пишут производные классы, содержащие виртуальные методы. Так что я бы сделал это исключительно для того, чтобы свести к минимуму головные боли по обслуживанию в будущем.
В идеале язык должен иметь способ гарантировать (неявно или нет), что деструктор является виртуальным в абстрактных классах, без необходимости определять его или делать его чистым. Но этого не произошло.
Итак, выбор таков: либо сделать его чистым и взять на себя бремя определения его в каждом производном классе, либо не делать его и нести бремя определения его в абстрактном классе. В последнем случае меньше работы и короче код, поэтому я бы пошел на это.