Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: виртуальный деструктор  (Прочитано 14984 раз)
0 Пользователей и 1 Гость смотрят эту тему.
dorador
Гость
« : 19-03-2004 08:58 » 

Среди tip of the day в VC6 есть такой совет:
Если вы размещаете память в производном классе, вы должны сделать деструктор для базового класса виртуальным.
А зачем :?:
Записан
Serega
Гость
« Ответ #1 : 19-03-2004 09:30 » 

Делать виртуальным деструктор стоит в том случае если существует инфраструктура для работы с данным классом и есть возможность(имеется смысл) расширения класса путем наследования
Если код, который работает с обьектами базового класса удаляет передаваемые ему обьекты, необходимо что бы вызвался деструктор не базового, а производного класса, эта проблема решается с помощью виртуального деструктора
Записан
Alf
Гость
« Ответ #2 : 19-03-2004 09:31 » 

Для того, чтобы при удалении объекта производного класса через указатель на базовый класс удаление прошло корректно. Другими словами, чтобы получить полиморфный деструктор.
Записан
dorador
Гость
« Ответ #3 : 19-03-2004 09:55 » 

Serega, ну ты завернул - особенно понравилось
Цитата

инфраструктура для работы с данным классом

Alf, спасибо понял
а если всегда делать деструктор виртуальным? хуже от этого не будет?
Записан
Serega
Гость
« Ответ #4 : 19-03-2004 12:07 » 

Не будет, вопросы о необходимости виртуальных функций встает только при оптимизации
Записан
Alf
Гость
« Ответ #5 : 19-03-2004 12:37 » 

Цитата: dorador
...Alf, спасибо понял
а если всегда делать деструктор виртуальным? хуже от этого не будет?
Если есть вероятность, что класс в дальнейшем послужит базовым для другого класса, то весьма желательно сделать его деструктор виртуальным.
Виртуальность деструктора приведет к весьма незначительным, на мой взгляд, накладным расходам: вместо непосредственного вызова деструктора он будет вызван через указатель в VTBL, т.е. косвенно. Учитывая, что деструктор для данного объекта вызывается единственный раз, то, если не уничтожать объекты миллионами, эти наносекунды вряд ли удастся заметить на практике.
Записан
lapulya
Молодой специалист

ru
Offline Offline

« Ответ #6 : 19-03-2004 13:37 » 

Ну и кроме всего прочего объекты этого и соответственно производных классов увеличатся в размере, на размер одного поинтера!!! т.е. если как написал Alf объекты создавать миллионами то и память готовь на 1000000 * sizeof(long) больше, это для начала, а потом (правда это почти никому не надо но всетаки это отличия), пусть есть класс
Код:
class Point
{
   short int x;
   short int y;
public:
   Point(short int x, short int y);
   ~Point();
};
если short int  занимает 16 бит, то объект Point поместится в 32 битовый регистр - ускорение работы, это еще не все, объект Point можно передать функции написанной на другом языке например C или Fortran как 32-х битовое значение, а если деструктор сделать виртуальным, то мы лишимся всего перечисленного (кроме конечно отжора памяти) (Скотт Мейерс More Effective C++)
« Последнее редактирование: 25-11-2007 13:48 от Алексей1153++ » Записан

С уважением Lapulya
Kuzmich
Гость
« Ответ #7 : 19-03-2004 14:04 » 

Цитата

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

в некоторых организациях это является обязательным требованием
Записан
grozny
Гость
« Ответ #8 : 15-04-2004 03:07 » 

хуже может быть только в очень специальном случае, когда объекты класса постоянно создаются/убиваются в критической по времени секции, тогда можно задуматься. В 99% случаев вреда не будет, а потенциальный баг будет ликвидирован. Взрыв на "неожиданном" виртуальном деструкторе выглядит довольно загадочно.
Записан
Pirks
Гость
« Ответ #9 : 15-04-2004 06:51 » 

Нельзя делать дестрактор виртуальным всегда, т.к. у базового класса могут быть private- members которые то-же нужно освобождать.
Записан
Roman123
Гость
« Ответ #10 : 16-04-2004 12:14 » new

2Pirks:
члены базового класса удалит деструктор базового класа, который будет вызван после визова деструктора потомка
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines