Should an abstract class' destructor be pure virtual?

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?

14
задан spc-mrn 17 August 2010 в 13:45
поделиться

4 ответа

Если вы хотите, чтобы ваш класс был абстрактным, и он не имеет чисто виртуальных функций - оставь это деструктору.

На самом деле, я не думаю, что есть еще кое-что. Все, что делает чистый виртуальный деструктор, делает весь класс абстрактным. Вы должны предоставить реализацию для чистого виртуального деструктора, а также для виртуального деструктора, не являющегося чистым, деструкторы производных классов являются виртуальными только с виртуальным деструктором и т. Д.

В принципе, если класс уже имеет некоторую чистую виртуальную функции, его поведение будет эквивалентно виртуальному и чисто виртуальному деструктору.

11
ответ дан 1 December 2019 в 12:51
поделиться

Нет. Если базовый класс что-то выделяет, он обязан освободить это.

Кроме того, если производный класс ничего не выделяет, нет смысла заставлять их писать фиктивный dtor.

11
ответ дан 1 December 2019 в 12:51
поделиться

Если ваш абстрактный класс представляет собой чистый интерфейс без элементов данных, вы могли бы обойтись с созданием виртуального dtor. Я сам предпочитаю это, так как я видел, как очень много горячих программистов вообще забывают создать виртуальный деструктор: даже когда они пишут производные классы, содержащие виртуальные методы. Так что я бы сделал это исключительно для того, чтобы свести к минимуму головные боли по обслуживанию в будущем.

-2
ответ дан 1 December 2019 в 12:51
поделиться

В идеале язык должен иметь способ гарантировать (неявно или нет), что деструктор является виртуальным в абстрактных классах, без необходимости определять его или делать его чистым. Но этого не произошло.

Итак, выбор таков: либо сделать его чистым и взять на себя бремя определения его в каждом производном классе, либо не делать его и нести бремя определения его в абстрактном классе. В последнем случае меньше работы и короче код, поэтому я бы пошел на это.

1
ответ дан 1 December 2019 в 12:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: