Должен ли деструктор абстрактного класса быть чисто виртуальным? - PullRequest
14 голосов
/ 17 августа 2010

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

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

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

Еще несколько применений?

Ответы [ 4 ]

11 голосов
/ 17 августа 2010

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

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

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

11 голосов
/ 17 августа 2010

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

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

1 голос
/ 17 августа 2010

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

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

0 голосов
/ 17 августа 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...