Суббота, 14.06.2025, 18:14
Приветствую Вас Гость | RSS
Форма входа
Поиск
Календарь
«  Июнь 2025  »
ПнВтСрЧтПтСбВс
      1
2345678
9101112131415
16171819202122
23242526272829
30
Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0

Чисто виртуальный деструктор

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


Да, может!


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


Это нужно в тех практически редких случаях, когда требуется создать иерархию классов, в которой необходимо запретить создание объектов базового класса. А других чисто виртуальных функций у базового класса нет, т.е. все виртуальные методы имеют разумное поведение по умолчанию. Т.о. у наследников нет необходимости переопределять все методы базового класса, они сами выбирают, что переопределять в своём поведении, а что оставить по умолчанию.


В отличие от других чисто виртуальных функций, виртуальный деструктор требует определения:


class A // абстрактный класс

{

virtual ~A()=0; // чистый виртуальный деструктор

};

A::~A() // определение чистого деструктора

{cout << "Abstract"<< endl;}

// наследник – не абстрактный класс

class B: public A { };


Почему чисто виртуальный деструктор обязательно должен быть не только объявлен, но и определён?


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


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