Должен ли деструктор абстрактного класса быть чистым виртуальным?

Я считаю, что виртуального в целом достаточно.

Есть ли еще одна причина сделать его чистым виртуальным, чем заставить производные классы реализовать свой собственный деструктор? Я имею в виду, что если вы выделяете что-то в конструкторе своего класса, вы должны использовать собственный деструктор - если ваш класс получен или нет.

Не считается ответом, как я уже знаю. Если вы хотите, чтобы ваш класс был абстрактным и не имел чистых виртуальных функций, оставьте его деструктору.

Используется еще несколько?

Ответы

Ответ 1

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

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

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

Ответ 2

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

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

Ответ 3

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

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

Ответ 4

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