Так зачем нужен чисто виртуальный деструктор?

написал такой я код:
//теперь А абстрактныйclass A { public:  virtual ~A()=0{}};//В не абстрактный - дестркутор не наследуется, //но т.к. A::~A виртуальный, //то нужно вызвать из ~B базовый ~A, //поэтому ~A определен в A.class B : public A{};....B b;....
Вопрос А нафига?) зачем нужны чисто виртуальные деструкторы? где могут пригодиться?
14 ответов

Чтобы ты не забыл переопределить его в производном классе


нигде


Чисто виртуальные деструкторы нужны, чтобы явно сделать класс абстрактным с одной стороны(“чистота”), то есть запретить создавать его экземпляры (совет делать все базовые классы по возможности абстрактными часто упоминается при описании реализации ООП в C++), и, с другой (виртуальность), гарантировать корректное удаление экземпляров производных классов через указатель или ссылку на базовый.Кстати, то, что у вас написано, у меня вообще не скомпилировалось. Скомпилировалось вот так:
class Base {public:    virtual ~Base() = 0;};Base::~Base() {}
Как и продемонстрировано в книжке Мейерса “Эффективное использование C++”, в совете “Убедитесь, что базовые классы имеют виртуальные деструкторы” (в моем издании это 14-ый совет, в другом может отличаться). Более детальное обсуждение можно посмотреть там же.


Кстати, то, что у вас написано, у меня вообще не скомпилировалось
Так он пытается чисто виртуальной функции (деструктору) тело определить
Base::~Base() {}
нельзя этого делать


Объект с чисто виртуальным деструктором нельзя использовать, так как при удалении объекта вызывается его деструктор, а потом деструктор его базового класса,..


Annihilator, можно. Для деструктора можно, это единственное исключение. Почитайте Мейерса. Это продиктовано жестким порядком вызова деструкторов в иерархии классов, как сказал Lazin.


Вопрос А нафига?) зачем нужны чисто виртуальные деструкторы? где могут пригодиться?
Если других чисто виртуальных функций нет, но нужно сделать класс абстракным.
Annihilator, можно. Для деструктора можно, это единственное исключение. 
Это не единственное исключение. Можно делать класс с чисто виртуальными функциями, имеющими тело. 


Цитата(Ulysses4j @  17.7.2008,  21:30 )
Annihilator, можно. Для деструктора можно, это единственное исключение. 
Это не единственное исключение. Можно делать класс с чисто виртуальными функциями, имеющими тело.
Вот ведь: век живи — век учись. Совершенно верно: “чистота” виртуальной функции класса запрещает создание экземпляра этого класса в любом случае и позволяет не определять тело данной функции, но не запрещает сделать это.


1. определять тело можно для любых чисто-виртуальных методов (включая дестркутор).так что Annihilator гонит, а трое что поставили ему +3 плохо учились))2.
Объект с чисто виртуальным деструктором нельзя использовать, так как при удалении объекта вызывается его деструктор, а потом деструктор его базового класса,..
это тож неправда. мой пример это демонстрирует.3.вот это мне более-менее понравилось...
Если других чисто виртуальных функций нет, но нужно сделать класс абстракным.
впрочем, я могу запретить создание экземпляра класса и так:
//экземпляр объекта типа А создать нельзяclass A { protected:    A(){}};//а вот наследоваться - пожалуйста.class B : public A {};
но эт уж не абстрактность....этим ответом я думаю можно и закончить... если нету еще мыслей....


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


Кстати, то, что у вас написано, у меня вообще не скомпилировалось. 
И не должно - стандарт не разрешает определять чисто виртуальную функцию внутри определения класса.


пункт стандарта, если смотрели, подскажите...


определять тело можно для любых чисто-виртуальных методов (включая дестркутор)
точно, сам проверил щас
так что Annihilator гонит
да не хотел я никого обманывать...   честно