LINUX.ORG.RU

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


0

0

Однажды столкнулся с утверждением (применительно к Windows), что если деструкторы в наследуемых классах не будут виртуальными, то при уничтожении объекта будут отрабатывать только деструкторы наследуемых классов, а базовые деструкторы остаются в пролёте. А если сделать деструктор наследуемого класса виртуальным (ну и базового наверное тоже), то будут отрабатывать _все_ деструкторы. Только что проверил это для линуха. Вроде без виртуальности всё работает. Когда я писал портабельный софт, то мне порекомендовали делать все деструкторы классов виртуальными. Объясните, пожалуйста, действительно ли это является истиной, или это чья-та ошибка??

anonymous

> если деструкторы в наследуемых классах не будут виртуальными,
> то при уничтожении объекта будут отрабатывать только деструкторы
> наследуемых классов

это неправда

> мне порекомендовали делать все деструкторы классов виртуальными.

это иногда полезно:

Base *p = new Derived;
delete p;

idle ★★★★★
()

В общем, idle все сказал. Но я бы так поставил акцент:

Если есть хоть один виртуальный метод, деструктор должен быть виртуальным.

Die-Hard ★★★★★
()
Ответ на: комментарий от Die-Hard

спасибо, теперь всё становится понятным.
А как в Qt дело обстоит? там как-то автоматически генерируется
виртуальный деструктор или там просто другой механизм?
Не видел там просто деструкторов, указанных явно ...

anonymous
()

Как уже показали все зависит от использования объекта класса. В общем случае никогда не помешает определять для класса конструктор копирования, оператор присваивания и виртуальный деструктор.

linuxsoft
()
Ответ на: комментарий от anonymous

Там практически не используется функциональность деструкторов кроме как в контейнерах (контейнеры могут очищаться при уничтожении). А так как все виджеты и так всегда помещаются в контейнеры, то в общем для работы самой QT необходимости иметь виртуальные диструкторы нет. С другой стороны нужны ли они твоему коду - решай естественно сам.

eXOR ★★★★★
()
Ответ на: комментарий от Die-Hard

На самом деле ты не прав, не обязательно деструктор дожен быть виртуальным, если есть виртуальные методы. Виртуальный деструктор нужно только в том случае если ты будешь удалять объект по указателю на рожителя, И ТОЛЬКО В ЭТОМ СЛУЧАЕ.

Кстати достаточно чтобы только в базовом классе деструктор был виртуальным, остальные будут виртуальными автоматически

mumg
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.