forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   C++ (http://forum.boolean.name/forumdisplay.php?f=22)
-   -   C++, Наследование, Деструктор (http://forum.boolean.name/showthread.php?t=7334)

wolfhound512 16.11.2008 00:36

C++, Наследование, Деструктор
 
Всем привет.
Помогите разобраться.

Необходимо удалить объект неизвестного производного класса по его базовому классу.

Вот код задачи:
PHP код:

#include <iostream>
#include <typeinfo>

using namespace std;

class 
base {
    
int s;
public:
    
base() {}
    ~
base() { cout << "Delete Base" << endl << endl; }

    
virtual int get() { return(s); }
};

class 
dev : public base {
    
int k;
public:
    
dev() {}
    ~
dev() { cout << "Delete Dev" << endl; }

    
virtual int get() { return(k); }
};

void del(baseel) {
    
cout << typeid(*el).name() << endl;
    
delete el;
}

int _tmain(int argc_TCHARargv[])
{
    
dev= new dev;
    
del(d);

    
dev= new dev;
    
delete z;

    return 
0;


Dev - производный класс от Base. Если заранее известно что он именно dev, то он удаляется нормально. Если же передать его указатель в функцию как Base, то удаляется только его базовая часть, хотя typeid определяет его правильно.
Вот что выдет программа:
Цитата:

class dev
Delete Base

Delete Dev
Delete Base
Как правильно удалить элемент если известен только его базовый класс?
Не писать же каждому производному классу виртуальную функцию удаления...

jimon 16.11.2008 00:57

Ответ: C++, Наследование, Деструктор
 
пиши virtual ~base() { ... }

HolyDel 16.11.2008 00:57

Ответ: C++, Наследование, Деструктор
 
virtual ~base
virtual ~dev

не?

\\правко - джимон опередил.

wolfhound512 16.11.2008 01:17

Ответ: C++, Наследование, Деструктор
 
Спасибо!

Приходила такая мысль в голову, но даже пробовать не стал, т.к. было в учебнике написано что перед конструкторами и деструкторами ничего стоять не должно, вот и подумал что к virtual это тоже относится...

HolyDel 16.11.2008 02:18

Ответ: C++, Наследование, Деструктор
 
wolfhound512 если в классе есть виртуальные методы то и деструктор стоит сделать виртуальным. как минимум на всякий случай.


Часовой пояс GMT +4, время: 12:16.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot