Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   forum.boolean.name > Программирование игр для компьютеров > C++

Ответ
 
Опции темы
Старый 16.11.2008, 00:36   #1
wolfhound512
Знающий
 
Аватар для wolfhound512
 
Регистрация: 18.02.2008
Сообщений: 276
Написано 121 полезных сообщений
(для 299 пользователей)
C++, Наследование, Деструктор

Всем привет.
Помогите разобраться.

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

Вот код задачи:
#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
Как правильно удалить элемент если известен только его базовый класс?
Не писать же каждому производному классу виртуальную функцию удаления...
(Offline)
 
Ответить с цитированием
Старый 16.11.2008, 00:57   #2
jimon
 
Сообщений: n/a
Ответ: C++, Наследование, Деструктор

пиши virtual ~base() { ... }
 
Ответить с цитированием
Старый 16.11.2008, 00:57   #3
HolyDel
 
Регистрация: 26.09.2006
Сообщений: 6,035
Написано 1,474 полезных сообщений
(для 2,707 пользователей)
Ответ: C++, Наследование, Деструктор

virtual ~base
virtual ~dev

не?

\\правко - джимон опередил.
(Offline)
 
Ответить с цитированием
Старый 16.11.2008, 01:17   #4
wolfhound512
Знающий
 
Аватар для wolfhound512
 
Регистрация: 18.02.2008
Сообщений: 276
Написано 121 полезных сообщений
(для 299 пользователей)
Ответ: C++, Наследование, Деструктор

Спасибо!

Приходила такая мысль в голову, но даже пробовать не стал, т.к. было в учебнике написано что перед конструкторами и деструкторами ничего стоять не должно, вот и подумал что к virtual это тоже относится...
__________________
GUI, GUIw512, AlbaLynx, Форум
(Offline)
 
Ответить с цитированием
Старый 16.11.2008, 02:18   #5
HolyDel
 
Регистрация: 26.09.2006
Сообщений: 6,035
Написано 1,474 полезных сообщений
(для 2,707 пользователей)
Ответ: C++, Наследование, Деструктор

wolfhound512 если в классе есть виртуальные методы то и деструктор стоит сделать виртуальным. как минимум на всякий случай.
(Offline)
 
Ответить с цитированием
Ответ


Опции темы

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Виртуальное наследование wolfhound512 C++ 4 26.11.2009 12:38
Наследование Serg_Bloim Программирование 1 07.01.2009 21:57
Конструктор - Деструктор SubZer0 FAQ 6 09.08.2006 11:04
А где события, наследование классов контролов? Glex Основной форум 6 24.05.2006 22:55


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


vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com