Может ли деструктор быть чисто виртуальным?
Да, может!
Для чего нужен чисто виртуальный деструктор?
Это нужно в тех практически редких случаях, когда требуется создать иерархию классов, в которой необходимо запретить создание объектов базового класса. А других чисто виртуальных функций у базового класса нет, т.е. все виртуальные методы имеют разумное поведение по умолчанию. Т.о. у наследников нет необходимости переопределять все методы базового класса, они сами выбирают, что переопределять в своём поведении, а что оставить по умолчанию.
В отличие от других чисто виртуальных функций, виртуальный деструктор требует определения:
class A // абстрактный класс
{
virtual ~A()=0; // чистый виртуальный деструктор
};
A::~A() // определение чистого деструктора
{cout << "Abstract"<< endl;}
// наследник – не абстрактный класс
class B: public A { };
Почему чисто виртуальный деструктор обязательно должен быть не только объявлен, но и определён?
Потому что при уничтожении объекта производного класса обязательно вызывается деструктор базового класса.
Второе отличие чисто виртуального деструктора от обычной чисто виртуальной функции в том, что при отсутствии явного определения деструктора в производном классе он всё равно будет создан автоматически. Ведь деструкторы не наследуются. Таким образом, производный класс, для которого не определён деструктор, не будет абстрактным.