Как заставить их вызываться диструкторы потомков?
От: Seregik  
Дата: 28.10.02 23:38
Оценка:
Есть вот такая програмка.

И ведь транслируется и наверно даже работает.
Но точно неправильно. При удалении списка "some_list" не вызываются
диструкторы классов "some_A" и "some_B".
Вопрос: А как заставить их вызываться?

typedef char type1;
typedef double type2;

class base_class
{

public:

    base_class(){};
    ~base_class(){};
};


class some_A:public base_class
{
    type1* pY;

public:

    some_A(type1* ptr){pY=ptr;};
    ~some_A(){delete pY;};
};


class some_B:public base_class
{
    type2* pZ;

public:

    some_B(type2 *ptr){pZ=ptr;};
    ~some_B(){delete pZ;};
};

template <class T>
class some_list
{
    T* pItem;
    some_list<T>* pn;
public:
    some_list(){ pItem=0; pn=0; };
    ~some_list(){
        if (pn)
            delete pn;
        delete pItem;
    }

    void Add(T* ptr){
        // ....
        some_list<T>* pt=new some_list<T>;
        pt->pItem=ptr;
        pt->pn=pn;
        pn=pt;
        // ....
    }

};

int main(int argc, char* argv[])
{

    some_list<base_class>* pL=new some_list<base_class>;

    pL->Add(new some_A(new type1(1)));
    pL->Add(new some_B(new type2(2.0)));

    delete pL;

    return 0;
}
Re: Как заставить их вызываться диструкторы потомков?
От: RmzVoid Россия  
Дата: 29.10.02 01:41
Оценка:
Здравствуйте Seregik

объяви деструкторы виртуальными...
Re: Как заставить их вызываться диструкторы потомков?
От: unintruder  
Дата: 29.10.02 05:27
Оценка:
Здравствуйте Seregik, Вы писали:

Деструктор базового класса должен быть виртуальным.
И кстати, может ли быть деструктор чисто виртуальным и есть ли в этом смысл ?
Re[2]: Как заставить их вызываться диструкторы потомков?
От: Аноним  
Дата: 29.10.02 06:14
Оценка:
Здравствуйте unintruder, Вы писали:

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


U>Деструктор базового класса должен быть виртуальным.

U>И кстати, может ли быть деструктор чисто виртуальным и есть ли в этом смысл ?

Дак я тоже так думал. Только почему-то при просто виртуальном диструкторе все равно не вызываются деструкторы потомков. А чисто виртуальные диструкторы не бывают.

Хотя извини в этом примере вызаваются это я в своей программе (там все гораздо сложнее) где-то наверно ступил чуток.

Спасибо за помощь
Re[3]: Как заставить их вызываться диструкторы потомков?
От: Инженер  
Дата: 29.10.02 06:53
Оценка:
Здравствуйте Аноним, Вы писали:

А>А чисто виртуальные диструкторы не бывают.


Бывают. Стандартом это разрешено.
Re[4]: Как заставить их вызываться диструкторы потомков?
От: __Nicolay Россия  
Дата: 29.10.02 07:03
Оценка:
Здравствуйте Инженер, Вы писали:

И>Здравствуйте Аноним, Вы писали:


А>>А чисто виртуальные диструкторы не бывают.


И>Бывают. Стандартом это разрешено.


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

Где-то по моему в книжке Мэйерса было про это написано.
Re[5]: Как заставить их вызываться диструкторы потомков?
От: Аноним  
Дата: 29.10.02 07:23
Оценка:
Здравствуйте __Nicolay, Вы писали:

А>>>А чисто виртуальные диструкторы не бывают.


И>>Бывают. Стандартом это разрешено.


N>Не знаю точно как в стандарте, а на практике, Объявление чисто виртуального деструктора разрешено, но деструктор предка вызывается в любом случае, даже если деструктор предка объявлен как чисто виртуальный, т.е. если он нигде не определен, то будет ошибка при линковке.


N>Где-то по моему в книжке Мэйерса было про это написано.


Значит, не нужно читать таких книжек.
Re[6]: Как заставить их вызываться диструкторы потомков?
От: __Nicolay Россия  
Дата: 29.10.02 08:05
Оценка:
Здравствуйте Аноним, Вы писали:

А>Значит, не нужно читать таких книжек.

Почему?
Там было кажется написано зачем может понадобится чисто виртуальный деструктор.

У Страуструпа я про это ничего не нашел, но в чисто абстрактных классах у него виртуальный деструктор определен.
Re[6]: Как заставить их вызываться диструкторы потомков?
От: Bell Россия  
Дата: 29.10.02 08:08
Оценка:
Здравствуйте Аноним, Вы писали:

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


А>>>>А чисто виртуальные диструкторы не бывают.


И>>>Бывают. Стандартом это разрешено.


N>>Не знаю точно как в стандарте, а на практике, Объявление чисто виртуального деструктора разрешено, но деструктор предка вызывается в любом случае, даже если деструктор предка объявлен как чисто виртуальный, т.е. если он нигде не определен, то будет ошибка при линковке.


N>>Где-то по моему в книжке Мэйерса было про это написано.


А>Значит, не нужно читать таких книжек.


Да нет, именно такие книжки и нужно читать...
Любите книгу — источник знаний (с) М.Горький
Re[3]: Как заставить их вызываться диструкторы потомков?
От: Fiend  
Дата: 29.10.02 08:09
Оценка:
U>>И кстати, может ли быть деструктор чисто виртуальным и есть ли в этом смысл ?

Может, если ты хочешь чтобы класс был абстрактным, а все твои виртуальные функции не являются чисто виртуальными (даже если они чисто виртуальные, то все равно можно и для них определение дать, только придется их вызывать статически .

А>Дак я тоже так думал. Только почему-то при просто виртуальном диструкторе все равно не вызываются деструкторы потомков. А чисто виртуальные диструкторы не бывают.


Бывают! Посмотри, допустим, как в МФЦ объявлен CObject. Там именно такой деструктор. Правда при всей своей чистоте, ты все равно должен дать его определение.
Re[7]: Как заставить их вызываться диструкторы потомков?
От: Аноним  
Дата: 29.10.02 08:14
Оценка:
Здравствуйте Bell, Вы писали:

N>>>Не знаю точно как в стандарте, а на практике, Объявление чисто виртуального деструктора разрешено, но деструктор предка вызывается в любом случае, даже если деструктор предка объявлен как чисто виртуальный, т.е. если он нигде не определен, то будет ошибка при линковке.


N>>>Где-то по моему в книжке Мэйерса было про это написано.


А>>Значит, не нужно читать таких книжек.


B>Да нет, именно такие книжки и нужно читать...


Дело в том, что, даже объявив деструктор чисто виртуальным, ему по-прежнему можно дать определение. И ошибок "линковки" (т. е. сборки) не будет.
Re[7]: Как заставить их вызываться диструкторы потомков?
От: Аноним  
Дата: 29.10.02 08:16
Оценка:
Здравствуйте __Nicolay, Вы писали:

А>>Значит, не нужно читать таких книжек.

N>Почему?
N>Там было кажется написано зачем может понадобится чисто виртуальный деструктор.

N>У Страуструпа я про это ничего не нашел, но в чисто абстрактных классах у него виртуальный деструктор определен.


Ну так и я про то же — но писать, будто чисто виртуальные деструкторы невозможны, — это же неправда. Его просто надо определить, и все будет хорошо.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.