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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Интерфейс, вызов деструктора наследника :) 
:(
    Опции темы
lv151
Дата 23.7.2009, 09:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 916
Регистрация: 11.2.2008

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



Код

class IIn
{
  virtual void Fun1() = 0;    
}

class MyClass1:public IIn
{
  virtual void Fun1();    
}


в проге:
Код

IIn* in;
in = new MyClass1;
delete  in; 


Не вызывается деструктор наследника, что посоветуете?

PM MAIL   Вверх
andrew_121
Дата 23.7.2009, 09:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 10
Всего: 33



lv151, А где деструкторы?


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
lv151
Дата 23.7.2009, 09:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 916
Регистрация: 11.2.2008

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



Код

class MyClass1:public IIn
{
  virtual void Fun1();    
  virtual ~MyClass1();
}



Это сообщение отредактировал(а) lv151 - 23.7.2009, 09:29
PM MAIL   Вверх
andrew_121
Дата 23.7.2009, 09:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 10
Всего: 33



lv151, А у него тело есть?
Покажи лучше полный пример. Чтоб компилировался.


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
zim22
Дата 23.7.2009, 09:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 29
Всего: 69



Цитата(lv151 @  23.7.2009,  09:23 Найти цитируемый пост)
что посоветуете?

определить виртуальный деструктор в базовом классе, а не в производном smile


--------------------
PM MAIL   Вверх
lv151
Дата 23.7.2009, 10:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 916
Регистрация: 11.2.2008

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



Код

class IIn
{
public:
    virtual void Fun1() = 0;    
    virtual ~IIn(){}
};

class MyClass1:public IIn
{
public:
    virtual void Fun1(){};    
    virtual ~MyClass1()
    {
        int x = 1;
    };
};

int main(int argc, char* argv[])
{
    IIn* in = new MyClass1;
    delete in;

    return 0;
}


smile

Всем спасибо!

Это сообщение отредактировал(а) lv151 - 23.7.2009, 10:09
PM MAIL   Вверх
andrew_121
Дата 23.7.2009, 10:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 10
Всего: 33



Цитата(zim22 @  23.7.2009,  09:36 Найти цитируемый пост)
определить виртуальный деструктор в базовом классе, а не в производном

Странно что его там нет.


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
baldman88
Дата 23.7.2009, 10:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 210
Регистрация: 18.1.2009

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



Извиняюсь за такой вопрос, но разве в MyClass1 функцию Fun1 и деструктор нужно объявлять  виртуальными (если от него ничего не наследуется) ???  smile 
PM MAIL   Вверх
Gordon
Дата 23.7.2009, 10:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 459
Регистрация: 9.7.2006

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



Цитата(baldman88 @  23.7.2009,  11:45 Найти цитируемый пост)
Извиняюсь за такой вопрос, но разве в MyClass1 функцию Fun1 и деструктор нужно объявлять  виртуальными (если от него ничего не наследуется) ??? 


Ну, главное чтобы в базовом были виртуальными.

Добавлено @ 10:54
Если вот так написать:
Код

class CA {
public:
    CA() { cout << "CA()" << endl; }
    virtual ~CA() { cout << "~CA()" << endl; }
};

class CB : public CA {
    public:
      CB() { cout << "CB()" << endl; }
     ~CB() { cout << "~CB()" << endl; }
};

class CC : public CB {
    public:
    CC() { cout << "CC()" << endl; }
    ~CC() { cout << "~CC()" << endl; }
};

class CD : public CC {
    public:
     CD() { cout << "CD()" << endl; }
    ~CD() { cout << "~CD()" << endl; }
};

int _tmain(int argc, _TCHAR* argv[])
{
    CA *p = new CD();
    delete p;
    CB *p1 = new CD();
    delete p1;
        
    return 0;
}


В обоих случаях деструкторы будут вызываться корректно...



Это сообщение отредактировал(а) Gordon - 23.7.2009, 10:58


--------------------

  
     
PM MAIL WWW   Вверх
zim22
Дата 23.7.2009, 11:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 29
Всего: 69



Цитата(Gordon @  23.7.2009,  10:50 Найти цитируемый пост)
В обоих случаях деструкторы будут вызываться корректно...

хочу добавить: они будут вызыываться корректно потому что в базовом классе деструктор был объявлен с помощью ключевого слова virtual. Это значит, что в производных классах все деструкторы также становятся virtual независисимо от того, указываем ли мы это явно (т.е. приписываем слово virtual) или просто пишем без него. Слово virtual в производных классах больше предназначено для людей, читающих код, чем для компилятора.
Цитата(baldman88 @  23.7.2009,  10:45 Найти цитируемый пост)
 разве в MyClass1 функцию Fun1 и деструктор нужно объявлять  виртуальными (если от него ничего не наследуется) ???

"виртуальным" деструктор и так уже будет в производном классе, хотите вы этого или нет, т.к. класс MyClass1 наследуется от базового класса IIn, в котором уже есть виртуальный деструктор. 

Это сообщение отредактировал(а) zim22 - 23.7.2009, 11:29


--------------------
PM MAIL   Вверх
Gordon
Дата 23.7.2009, 11:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 459
Регистрация: 9.7.2006

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



Цитата(zim22 @  23.7.2009,  12:09 Найти цитируемый пост)
они будут вызыываться корректно потому что в базовом классе деструктор был объявлен с помощью ключевого слова virtual


Да!

Цитата(zim22 @  23.7.2009,  12:09 Найти цитируемый пост)
Слово virtual больше предназначено для людей, читающих код, чем для компилятора.


В производных классах больше для людей... )))



--------------------

  
     
PM MAIL WWW   Вверх
zim22
Дата 23.7.2009, 11:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 29
Всего: 69



 smile 
Цитата(Gordon @  23.7.2009,  11:27 Найти цитируемый пост)
В производных классах больше для людей... )))

угу, добавил. smile


--------------------
PM MAIL   Вверх
Gordon
Дата 23.7.2009, 11:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 459
Регистрация: 9.7.2006

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



Цитата(zim22 @  23.7.2009,  12:09 Найти цитируемый пост)
"виртуальным" деструктор и так уже будет в производном классе


А вот здесь интересно, сами деструкторы (а еще конструкторы, operator= и функции-друзья, вроде дак) не наследуются, а их (еструкторов) виртуальность наследуется... Так ведь получается?


--------------------

  
     
PM MAIL WWW   Вверх
zim22
Дата 23.7.2009, 12:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 29
Всего: 69



Цитата(Gordon @  23.7.2009,  11:32 Найти цитируемый пост)
 Так ведь получается?

да, так. наследуется виртуальность деструктора и функций-членов.


--------------------
PM MAIL   Вверх
baldman88
Дата 23.7.2009, 12:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 210
Регистрация: 18.1.2009

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



С деструкторами разобрался(вроде как) -- получается объявление виртуального деструктора(в базовом классе), гарантирует вызов корректного деструктора в любом случае(при обращении через указатель на базовый класс). Ну а как быть с обычными функциями-членами(например Fun1)? Разве virtual не переопределяет её, то есть если класс MyClass2 будет наследником MyClass1, какая функция будет в нём вызванна -- из базоваго класса или же из MyClass1 ?
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


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

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


 




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


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

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