VC++ 6.0 при создании класса автоматически генерирует виртуальные деструкторы.
Для этого явно есть веская причина. Предпологаю, что это связано с явным вызовом
деструкторов. Если есть идеи — ответьте.
Здравствуйте Tom, Вы писали:
Tom>VC++ 6.0 при создании класса автоматически генерирует виртуальные деструкторы. Tom>Для этого явно есть веская причина. Предпологаю, что это связано с явным вызовом Tom>деструкторов. Если есть идеи — ответьте.
Чтобы вызывался деструктор данного класса, а не базового...
Здравствуйте Tom, Вы писали:
Tom>VC++ 6.0 при создании класса автоматически генерирует виртуальные деструкторы. Tom>Для этого явно есть веская причина. Предпологаю, что это связано с явным вызовом Tom>деструкторов. Если есть идеи — ответьте.
Для того чтобы в не зависимости от того привел ты класс потомок к родителю или
вызывался деструктор потомка.
Пример
class A
{
public:
virtual ~A()
{
printf("Delete A");
}
};
class B:public A
{
public:
virtual ~B()
{
printf("Delete B");
}
};
....
B *pB = new B();
A *pA = (A*)pB;
delete A; // вызовится ~B
...
Здравствуйте Tom, Вы писали:
Tom>VC++ 6.0 при создании класса автоматически генерирует виртуальные деструкторы. Tom>Для этого явно есть веская причина
...А мне почему-то кажется что данное утверждение не соответствует действительности.
А если точнее — то бред это собачий
Tom>Предпологаю, что это связано с явным вызовом деструкторов.
Если и связано это с чем-то, то только с тем что ты наследуешься от класса у которого обьявлен виртуальный деструктор.
например:
class CBase {
....
virtual ~CBase()
};
class CChild: public CBase {
....
~CChild(); //<-- вот тут пиши virtual или не пиши, а деструктор будет
// все равно виртуальным. Потому что ~CBase() виртуален.
// Сие, впрочем отностися к любой виртуальной функции
};
____________________
God obviously didn't debug, hasn't done any maintenance, and no documentation can be found. Truly amateur work.
Здравствуйте Tom, Вы писали:
Tom>VC++ 6.0 при создании класса автоматически генерирует виртуальные деструкторы. Tom>Для этого явно есть веская причина. Предпологаю, что это связано с явным вызовом Tom>деструкторов. Если есть идеи — ответьте.
Здравствуйте Tom, Вы писали:
Tom>>VC++ 6.0 при создании класса автоматически генерирует виртуальные деструкторы. Tom>>Для этого явно есть веская причина. Предпологаю, что это связано с явным вызовом Tom>>деструкторов. Если есть идеи — ответьте.
Все просто, если деструктор не виртуальный возникнут утечки памяти, и еще неизвестно чего, ведь в наследнике может быть и различная инициализация.
Пример
class A
{
public:
virtual ~A()
{
printf("Delete A");
}
};
class B:public A
{
char * pszString;
public:
B(){ pszString = new char[100];}
virtual ~B()
{
delete [] pszString;
printf("Delete B");
}
};
....
A *pA = new B();
delete pA; // вызовится ~B
Здравствуйте TepMuHyc, Вы писали:
TMH>Здравствуйте Tom, Вы писали: Tom>>VC++ 6.0 при создании класса автоматически генерирует виртуальные деструкторы. Tom>>Для этого явно есть веская причина TMH>...А мне почему-то кажется что данное утверждение не соответствует действительности. TMH>А если точнее — то бред это собачий
TepMuHyc несколько погорячился...
Тут уже прозвучал ответ на вопрос, и не один раз :) но мне вспомнилось, как это объяснял Мейерс в своей книге "Эффективное использование С++"
Примерно так...
Представим, что имеется класс "Бронемашина"
class ArmoredVehicle
{
public:
ArmoredVehicle();
~ArmoredVehicle();
}
Однако выясняется, что наших заказчиков :) интересуют конкретные типы бронемашин, а именно БМП, который, помимо прочего, перевозит еще и от 0 до 10 солдат.
class Soldier
{
};
class BMP
{
public:
BMP(int NumberOfSoldiers);
~BMP();
private:
Soldier* pSquad;
};
BMP::BMP(int NumberOfSoldiers)
{
pSquad = new Soldier[NumberOfSoldiers];
}
BMP::~BMP()
{
delete[] pSquad;
}
Теперь попробуем создать БМП и уничтожить его.
ArmoredVehicle *pVehicle = new BMP(10);
DestroyArmoredVehicle(pVehicle);
Что произойдет?
При уничтожении объекта по указателю pVehicle будет вызван деструктор, соответствующий типу удаляемого объекта, в данном случае (в соответствии с типом переданного указателя) это будет ~ArmoredVehicle().
Данные, относящиеся к ArmoredVehicle, будут удалены, однако отделение солдат противника останется где-то в памяти держать оборону :)
Если бы деструктор для ArmoredVehicle был бы объявлен виртуальным, то вызвался бы деструктор ~BMP(), который бы корректно освободил ресурсы (память), занятые объектом.
Здравствуйте TepMuHyc, Вы писали:
TMH>Здравствуйте Tom, Вы писали: Tom>>VC++ 6.0 при создании класса автоматически генерирует виртуальные деструкторы. Tom>>Для этого явно есть веская причина TMH>...А мне почему-то кажется что данное утверждение не соответствует действительности. TMH>А если точнее — то бред это собачий
TepMuHyc несколько погорячился...
Тут уже прозвучал ответ на вопрос, и не один раз :) но мне вспомнилось, как это объяснял Мейерс в своей книге "Эффективное использование С++"
Примерно так...
Представим, что имеется класс "Бронемашина"
class ArmoredVehicle
{
public:
ArmoredVehicle();
~ArmoredVehicle();
}
Однако выясняется, что наших заказчиков :) интересуют конкретные типы бронемашин, а именно БМП, который, помимо прочего, перевозит еще и от 0 до 10 солдат.
class Soldier
{
};
class BMP
{
public:
BMP(int NumberOfSoldiers);
~BMP();
private:
Soldier* pSquad;
};
BMP::BMP(int NumberOfSoldiers)
{
pSquad = new Soldier[NumberOfSoldiers];
}
BMP::~BMP()
{
delete[] pSquad;
}
Теперь попробуем создать БМП и уничтожить его.
ArmoredVehicle *pVehicle = new BMP(10);
DestroyArmoredVehicle(pVehicle);
Что произойдет?
При уничтожении объекта по указателю pVehicle будет вызван деструктор, соответствующий типу удаляемого объекта, в данном случае (в соответствии с типом переданного указателя) это будет ~ArmoredVehicle().
Данные, относящиеся к ArmoredVehicle, будут удалены, однако отделение солдат противника останется где-то в памяти держать оборону :)
Если бы деструктор для ArmoredVehicle был бы объявлен виртуальным, то вызвался бы деструктор ~BMP(), который бы корректно освободил ресурсы (память), занятые объектом.
Здравствуйте Brother, Вы писали:
B>При уничтожении объекта по указателю pVehicle будет вызван деструктор, соответствующий типу удаляемого объекта, в данном случае (в соответствии с типом переданного указателя) это будет ~ArmoredVehicle(). B>Данные, относящиеся к ArmoredVehicle, будут удалены, однако отделение солдат противника останется где-то в памяти держать оборону B>Если бы деструктор для ArmoredVehicle был бы объявлен виртуальным, то вызвался бы деструктор ~BMP(), который бы корректно освободил ресурсы (память), занятые объектом.
Прям Solder of Fortune ))))
Доходчиво!
Здравствуйте, Tom, Вы писали:
Tom>VC++ 6.0 при создании класса автоматически генерирует виртуальные деструкторы. Tom>Для этого явно есть веская причина. Предпологаю, что это связано с явным вызовом Tom>деструкторов. Если есть идеи — ответьте.
Немного запоздало, но, тем не менее
class A
{
public:
A()
{
printf("A");
}
~A()
{
printf("~A");
}
};
class B: public A
{
public:
B()
{
printf("B");
}
~B()
{
printf("~B");
}
};
....
A* a = new B();
delete a;
B* b = new B();
delete b;
Результат — AB~AAB~B~A
Думаю, всем видно, что никаких виртуальных деструкторов здесь нет, иначе было бы AB~B~AAB~B~A.