MyTetra Share
Делитесь знаниями!
Про нужность виртуального деструктора
Время создания: 12.02.2009 17:21
Текстовые метки: c++, виртуальный, деструктор
Раздел: Компьютер - Программирование - Язык C++ (Си++)
Запись: xintrea/mytetra_syncro/master/base/0000000757/text.html на raw.github.com

В языке программирования C++ деструктор базового (полиморфного) класса должен объявляться виртуальным. Только так обеспечивается корректное разрушение объекта производного класса через указатель на соответствующий базовый класс.


Обычным является использование виртуального деструктора в классах, имеющих виртуальные функции. Более того, gcc, например, выдаст вам предупреждение, если вы не сделаете виртуальным деструктор, объявив виртуальную функцию.


Часто можно встретить миф: «виртуальный деструктор нужен лишь в том случае, когда на деструктор классов-потомков возлагаются какие-то нестандартные функции, если деструктор потомка не отличается по функционалу от родителя, то делать его виртуальным нет особого смысла». Это может и будет работать «сейчас», но может сыграть злую шутку в будущем, да и в общем-то не очень верно.


Если деструктор не виртуальный, то будет вызван деструктор того типа, какой заявлен в указателе (т. е. указатель запросто может иметь тип базового класса, хотя указывает на объект производного класса). В то же время будет правильнее, что для объектов-потомков должны вызываться свои деструкторы. Просто стоит принять это как правило, иначе в будущем могут быть очень большие проблемы с отладкой непонятно почему текучих в плане памяти программ.


Пример определения виртуального деструктора:



class Record

{

public:

Record();

virtual ~Record();

...

};



Пример реализации виртуального деструктора (синтаксис реализации ничем не отличается от обычного деструктора):



Record::~Record()

{

...

}



Так же в этом разделе:
 
MyTetra Share v.0.58
Яндекс индекс цитирования