В языке программирования C++ деструктор базового (полиморфного) класса должен объявляться виртуальным. Только так обеспечивается корректное разрушение объекта производного класса через указатель на соответствующий базовый класс.
Обычным является использование виртуального деструктора в классах, имеющих виртуальные функции. Более того, gcc, например, выдаст вам предупреждение, если вы не сделаете виртуальным деструктор, объявив виртуальную функцию.
Часто можно встретить миф: «виртуальный деструктор нужен лишь в том случае, когда на деструктор классов-потомков возлагаются какие-то нестандартные функции, если деструктор потомка не отличается по функционалу от родителя, то делать его виртуальным нет особого смысла». Это может и будет работать «сейчас», но может сыграть злую шутку в будущем, да и в общем-то не очень верно.
Если деструктор не виртуальный, то будет вызван деструктор того типа, какой заявлен в указателе (т. е. указатель запросто может иметь тип базового класса, хотя указывает на объект производного класса). В то же время будет правильнее, что для объектов-потомков должны вызываться свои деструкторы. Просто стоит принять это как правило, иначе в будущем могут быть очень большие проблемы с отладкой непонятно почему текучих в плане памяти программ.
Пример определения виртуального деструктора:
class Record
{
public:
Record();
virtual ~Record();
...
};
Пример реализации виртуального деструктора (синтаксис реализации ничем не отличается от обычного деструктора):
Record::~Record()
{
...
}
|