Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Деструктор, Базовый или производный класс? 
:(
    Опции темы
NightGoblin
Дата 22.4.2003, 09:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1021
Регистрация: 24.11.2002
Где: 127.0.0.1

Репутация: нет
Всего: 11



Привет всем. В общем, почитал я FAQ, про сам C++ там, собственно, немного, а рыться по сайтам можно всю жизнь smile.gif
А вопрос, собственно, простой:
Вот ситуация:

Код

class base {
  ...
}

class derived:
 public base {
  ...
}

base* p = new derived;
...
delete p;


Теперь. Конструктор класса derived в new будет вызван. Но как быть с деструктором - вызовется деструктор класса base или derived? Понимаю, что это RTFM, но у себя в доках я такого не нашел... sad.gif

Заранее сенькс smile.gif


--------------------
Kernel panic: /dev/null overflow!
GCS/IT/MU/O d-@ s: a- C++$>++++$ ULSB(+++) P+++ L+++>++++ !E W++(-) N o? K w-- O? M>+ V? PS+ PE Y+ PGP+>+++ t- 5 X+ R- !tv b+ DI+ D+ G e++ h--- r++ y?
B4F1 54B6 8738 26CD 5125 0581 B923 9273 FE59 1981
PM MAIL WWW ICQ   Вверх
DENNN
Дата 22.4.2003, 09:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 3878
Регистрация: 27.3.2002
Где: Москва

Репутация: 1
Всего: 43



Вызовется конструктор derived. Но для указателя base* p методы derived будут недоступны.
PM ICQ   Вверх
Vyacheslav
Дата 22.4.2003, 09:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

Репутация: 9
Всего: 59



В данном случае вызовется деструктор base. В результате как минимум можешь иметь после этой операции мусор в памяти. Для того что бы избежать этого, необходимо объявить деструктор Base виртуальным
Код

class Base
{
public:
    Base(){}
    virtual ~Base(){}
};

class Derived:public Base
{
public:
   Derived():Base(){}
   ~Derived(){}
}

base* p = new Derived;

delete p; //вызовется деструктор Derived



--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
NightGoblin
Дата 22.4.2003, 19:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1021
Регистрация: 24.11.2002
Где: 127.0.0.1

Репутация: нет
Всего: 11



Vyacheslav
Хм. Хорошо. Тогда, как из деструктора derived вызвать деструктор base? Базовый класс-то тоже как-то надо удалить... Аналогично конструктору
Код

derived::~derived ():
   ~base ()
{
   ...
}

или еще как-то?


--------------------
Kernel panic: /dev/null overflow!
GCS/IT/MU/O d-@ s: a- C++$>++++$ ULSB(+++) P+++ L+++>++++ !E W++(-) N o? K w-- O? M>+ V? PS+ PE Y+ PGP+>+++ t- 5 X+ R- !tv b+ DI+ D+ G e++ h--- r++ y?
B4F1 54B6 8738 26CD 5125 0581 B923 9273 FE59 1981
PM MAIL WWW ICQ   Вверх
Unregistered
Дата 22.4.2003, 23:51 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











ничего из деструктора вызывать не надо. Достаточно объявить деструктор базового класса виртуальным. При удалении объекта производного класса автоматически удалится и объект базового.
  Вверх
NightGoblin
Дата 23.4.2003, 08:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1021
Регистрация: 24.11.2002
Где: 127.0.0.1

Репутация: нет
Всего: 11



Все, тогда всем спасибо, вроде как вопросов больше нет smile.gif


--------------------
Kernel panic: /dev/null overflow!
GCS/IT/MU/O d-@ s: a- C++$>++++$ ULSB(+++) P+++ L+++>++++ !E W++(-) N o? K w-- O? M>+ V? PS+ PE Y+ PGP+>+++ t- 5 X+ R- !tv b+ DI+ D+ G e++ h--- r++ y?
B4F1 54B6 8738 26CD 5125 0581 B923 9273 FE59 1981
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0508 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.