Для чего нужны виртуальные деструкторы.
От: Tom Россия http://www.RSDN.ru
Дата: 26.11.01 11:29
Оценка: -1
VC++ 6.0 при создании класса автоматически генерирует виртуальные деструкторы.
Для этого явно есть веская причина. Предпологаю, что это связано с явным вызовом
деструкторов. Если есть идеи — ответьте.
Народная мудрось
всем все никому ничего(с).
Re: Для чего нужны виртуальные деструкторы.
От: megadoZ  
Дата: 26.11.01 11:47
Оценка:
Здравствуйте Tom, Вы писали:

Tom>VC++ 6.0 при создании класса автоматически генерирует виртуальные деструкторы.

Tom>Для этого явно есть веская причина. Предпологаю, что это связано с явным вызовом
Tom>деструкторов. Если есть идеи — ответьте.

Чтобы вызывался деструктор данного класса, а не базового...
Re: Для чего нужны виртуальные деструкторы.
От: OlegO Россия http://www.mediachase.ru
Дата: 26.11.01 11:54
Оценка: 6 (1)
Здравствуйте 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
...
С уважением, OlegO.
Re: Для чего нужны виртуальные деструкторы.
От: TepMuHyc  
Дата: 26.11.01 12:01
Оценка: -1
Здравствуйте 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.
Re: Для чего нужны виртуальные деструкторы.
От: KoraK Россия http:\\none.ru
Дата: 26.11.01 15:38
Оценка:
Здравствуйте Tom, Вы писали:

Tom>VC++ 6.0 при создании класса автоматически генерирует виртуальные деструкторы.

Tom>Для этого явно есть веская причина. Предпологаю, что это связано с явным вызовом
Tom>деструкторов. Если есть идеи — ответьте.

Для правильной работы при полиморфизме
Re[2]: Для чего нужны виртуальные деструкторы.
От: S D K Киргизия  
Дата: 27.11.01 03:55
Оценка:
Здравствуйте 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
Удачи.
Re[2]: Для чего нужны виртуальные деструкторы.
От: Brother Россия  
Дата: 30.11.01 12:21
Оценка: 3 (1)
Здравствуйте TepMuHyc, Вы писали:

TMH>Здравствуйте Tom, Вы писали:

Tom>>VC++ 6.0 при создании класса автоматически генерирует виртуальные деструкторы.
Tom>>Для этого явно есть веская причина
TMH>...А мне почему-то кажется что данное утверждение не соответствует действительности.
TMH>А если точнее — то бред это собачий

TepMuHyc несколько погорячился...
Тут уже прозвучал ответ на вопрос, и не один раз :) но мне вспомнилось, как это объяснял Мейерс в своей книге "Эффективное использование С++"
Примерно так...
Представим, что имеется класс "Бронемашина"
class ArmoredVehicle
{
public: 
  ArmoredVehicle();
  ~ArmoredVehicle();
}

И функция "Уничтожение бронемашины"
void DestroyArmoredVehicle(ArmoredVehicle* pVehicle)
{
  delete pVehicle;
}

Однако выясняется, что наших заказчиков :) интересуют конкретные типы бронемашин, а именно БМП, который, помимо прочего, перевозит еще и от 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(), который бы корректно освободил ресурсы (память), занятые объектом.
С уважением,
Сергей
Re[2]: Для чего нужны виртуальные деструкторы.
От: Brother Россия  
Дата: 30.11.01 12:22
Оценка:
Здравствуйте TepMuHyc, Вы писали:

TMH>Здравствуйте Tom, Вы писали:

Tom>>VC++ 6.0 при создании класса автоматически генерирует виртуальные деструкторы.
Tom>>Для этого явно есть веская причина
TMH>...А мне почему-то кажется что данное утверждение не соответствует действительности.
TMH>А если точнее — то бред это собачий

TepMuHyc несколько погорячился...
Тут уже прозвучал ответ на вопрос, и не один раз :) но мне вспомнилось, как это объяснял Мейерс в своей книге "Эффективное использование С++"
Примерно так...
Представим, что имеется класс "Бронемашина"
class ArmoredVehicle
{
public: 
  ArmoredVehicle();
  ~ArmoredVehicle();
}

И функция "Уничтожение бронемашины"
void DestroyArmoredVehicle(ArmoredVehicle* pVehicle)
{
  delete pVehicle;
}

Однако выясняется, что наших заказчиков :) интересуют конкретные типы бронемашин, а именно БМП, который, помимо прочего, перевозит еще и от 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(), который бы корректно освободил ресурсы (память), занятые объектом.
С уважением,
Сергей
Re[3]: Для чего нужны виртуальные деструкторы.
От: migel  
Дата: 30.11.01 13:13
Оценка:
Здравствуйте Brother, Вы писали:

B>При уничтожении объекта по указателю pVehicle будет вызван деструктор, соответствующий типу удаляемого объекта, в данном случае (в соответствии с типом переданного указателя) это будет ~ArmoredVehicle().

B>Данные, относящиеся к ArmoredVehicle, будут удалены, однако отделение солдат противника останется где-то в памяти держать оборону
B>Если бы деструктор для ArmoredVehicle был бы объявлен виртуальным, то вызвался бы деструктор ~BMP(), который бы корректно освободил ресурсы (память), занятые объектом.
Прям Solder of Fortune ))))
Доходчиво!
Re: Для чего нужны виртуальные деструкторы.
От: old->*Plutonia_Experiment() Беларусь http://blogs.rsdn.org/ikemefula
Дата: 24.01.03 11:45
Оценка:
Здравствуйте, 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.
Re[3]: Для чего нужны виртуальные деструкторы.
От: Dima2  
Дата: 24.01.03 13:16
Оценка:
Здравствуйте, Brother, Вы писали:

B>TepMuHyc несколько погорячился...


ничего он не погорячился. если есть базовый вирт. деструктор, то писать в остальных virtual необязательно
Re: Для чего нужны виртуальные деструкторы.
От: Awaken Украина  
Дата: 24.01.03 14:03
Оценка:
а никто не понял вопрос то и взялись Tomу (это который гуру в COM) объяснять то что очевидно

VC++ 6.0 при создании класса автоматически генерирует
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.