Должен ли деструктор абстрактного класса быть чисто виртуальным?
Я думаю, что одного виртуального обычно достаточно.
Есть ли другая причина сделать его чисто виртуальным, чем заставлять производные классы реализовывать свой собственный деструктор? Я имею в виду, что если вы выделяете что-то в конструкторе вашего класса, вы должны использовать свой собственный деструктор - независимо от того, является ли ваш класс производным или нет.
Не считается ответом, как я уже знаю: если вы хотите, чтобы ваш класс был абстрактным и у него не было чисто виртуальных функций - оставьте его деструктору.
Еще несколько применений?
4 ответа
Если вы хотите, чтобы ваш класс был абстрактным и у него не было чисто виртуальных функций - оставьте это деструктору.
На самом деле, я не думаю, что есть больше. Все, что делает чистый виртуальный деструктор, это делает весь класс абстрактным. Вы должны предоставить реализацию для чистого виртуального деструктора, а также для не чистого виртуального деструктора, деструкторы производных классов являются виртуальными только с виртуальным деструктором и т. Д.
По сути, если класс уже имеет несколько чисто виртуальных функций, его поведение будет эквивалентно виртуальному и чисто виртуальному деструктору.
Нет. Если базовый класс что-то выделяет, то это ответственность за его освобождение.
Кроме того, если производный класс ничего не выделяет, нет смысла заставлять их писать фиктивный dtor.
В идеале язык должен иметь способ гарантировать (неявно или нет), что деструктор является виртуальным в абстрактных классах без необходимости определять его или делать чистым. Но это не так.
Таким образом, выбор таков: либо сделайте его чистым, и возьмите на себя бремя определения его в каждом производном классе, либо сделайте это нет, и возьмите на себя бремя определения его в абстрактном классе. Чем позже, тем меньше работы, а также короче код, так что я бы пошел на это.
Если ваш абстрактный класс является чистым интерфейсом, без элементов данных, вы можете сделать dtor чисто виртуальным. Я предпочитаю это сам, так как я видел, как очень много горячих программистов вообще забывают создавать виртуальный деструктор: даже когда они пишут производные классы, содержащие виртуальные методы. Так что я бы сделал это исключительно для того, чтобы свести к минимуму проблемы с техническим обслуживанием в будущем.