Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.57/7: Рейтинг темы: голосов - 7, средняя оценка - 4.57
20 / 16 / 11
Регистрация: 07.12.2013
Сообщений: 244
1

Виртуальные деструкторы

01.02.2014, 10:46. Показов 1368. Ответов 21
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <iostream>
using namespace std;
 
class first
{
public:
    first();
    virtual ~first(){delete pointer;}
    virtual void text(){cout<<"text"<<endl;}
    void text2(){cout<<"text2"<<endl;}  
};
 
class second:public first
{
public:
    second();
    virtual ~second(){delete pointer;}
    virtual void text(){cout<<"text"<<endl;}        
    void text2(){cout<<"text2"<<endl;}
};
 
int main()
{   first *pointer=new second;
    pointer->text();
    pointer->text2();
    system("pause");
}
Как я понял правильно,вызовется сперва деструктор производного класса,т.к. он виртуальный,а потом он автоматически вызовет деструктор базового класса,чтобы окончательно удалить динамический объект.Тело деструкторов обоих классов написал криво,судя по логам компилятора:"нельзя удалять объекты, не являющиеся указателями".Помогите исправить.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
01.02.2014, 10:46
Ответы с готовыми решениями:

Виртуальные деструкторы
Можно ли вызвать деструктор базового класса вместо использования виртуальных деструкторов? class...

Виртуальные базовые классы и деструкторы
Пожалуйста, помогите разобраться. Решаю задачу 6 глава 17 из Праты. Кратко: в определении...

Наследование. Виртуальные методы/деструкторы.
Есть базовый класс Cell (код можно даже не смотреть - он просто для иллюстрации -&gt; вопрос внизу)...

Виртуальные и чисто виртуальные функции
Чем они отличаются?? если можно, с примерами. И как из виртуальной функции сделать чисто...

21
109 / 84 / 55
Регистрация: 01.02.2014
Сообщений: 281
01.02.2014, 11:08 2
C++
1
virtual ~first(){delete pointer;}
кто такой pointer? где он создается?
0
654 / 575 / 164
Регистрация: 13.12.2012
Сообщений: 2,124
01.02.2014, 11:35 3
Цитата Сообщение от Игорюня Посмотреть сообщение
C++
1
2
3
4
5
6
7
int main()
 {
 first *pointer=new second;
 pointer->text();
 pointer->text2();
 system("pause");
 }
интересно как Вы проверили работу деструктора, если тут даже не вызываете его, и автоматически он не вызывается
C++
1
2
3
4
///
delete pointer;
system("pause");
//
и кстати Меорн, прав, что Вы пытаетесь удалить то в деструкторе?
1
4064 / 3318 / 924
Регистрация: 25.03.2012
Сообщений: 12,492
Записей в блоге: 1
01.02.2014, 11:43 4
delete pointer...
0
654 / 575 / 164
Регистрация: 13.12.2012
Сообщений: 2,124
01.02.2014, 11:53 5
0
20 / 16 / 11
Регистрация: 07.12.2013
Сообщений: 244
01.02.2014, 12:18  [ТС] 6
Цитата Сообщение от aLarman Посмотреть сообщение
интересно как Вы проверили работу деструктора, если тут даже не вызываете его, и автоматически он не вызывается
C++
1
2
3
4
///
delete pointer;
system("pause");
//
и кстати Меорн, прав, что Вы пытаетесь удалить то в деструкторе?
Когда программа закончится,конструкторы не вызовутся сами?

Добавлено через 1 минуту
Я же сказал,что накосячил,помогли бы лучше,чем ржать.
0
654 / 575 / 164
Регистрация: 13.12.2012
Сообщений: 2,124
01.02.2014, 12:18 7
нет, Вы же выделяете память и там создаете объект, надо удалять)
1
20 / 16 / 11
Регистрация: 07.12.2013
Сообщений: 244
01.02.2014, 12:20  [ТС] 8
Цитата Сообщение от aLarman Посмотреть сообщение
нет, Вы же выделяете память и там создаете объект, надо удалять)
Ну ведь в теле деструктора динамический объект удаляется?
0
109 / 84 / 55
Регистрация: 01.02.2014
Сообщений: 281
01.02.2014, 12:21 9
если ты создаешь объект оператором new, то ты сам отвечаешь за его удаление.
0
4064 / 3318 / 924
Регистрация: 25.03.2012
Сообщений: 12,492
Записей в блоге: 1
01.02.2014, 12:22 10
Деструкторы тут вообще не нужны!
1
654 / 575 / 164
Регистрация: 13.12.2012
Сообщений: 2,124
01.02.2014, 12:22 11
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <iostream>
using namespace std;
 
class first
{
public:
    first(){cout<<"ConstrBase"<<endl;}
    virtual ~first(){cout<<"DestrBase"<<endl;}
    virtual void text(){cout<<"text"<<endl;}
    void text2(){cout<<"text2"<<endl;}  
};
 
class second:public first
{
public:
    second(){cout<<"ConstDeriv"<<endl;}
    virtual ~second(){cout<<"DestrDerive"<<endl;}
    virtual void text(){cout<<"text"<<endl;}        
    void text2(){cout<<"text2"<<endl;}
};
 
int main()
{   first *pointer=new second;
    pointer->text();
    pointer->text2();
    delete pointer;
    system("pause");
}
1
109 / 84 / 55
Регистрация: 01.02.2014
Сообщений: 281
01.02.2014, 12:22 12
а деструктаре не понятно что удоляется.
0
20 / 16 / 11
Регистрация: 07.12.2013
Сообщений: 244
01.02.2014, 12:23  [ТС] 13
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
Деструкторы тут вообще не нужны!
Ну мы же создали объект в динамической памяти?Его не надо удалять в ручную? У меня уже голова не варит.
0
654 / 575 / 164
Регистрация: 13.12.2012
Сообщений: 2,124
01.02.2014, 12:23 14
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
Деструкторы тут вообще не нужны!
Ну хочет человек проверить как работают констр\дестр\наследование, обязательно создавать сложные классы с указателями чтоли
1
4064 / 3318 / 924
Регистрация: 25.03.2012
Сообщений: 12,492
Записей в блоге: 1
01.02.2014, 12:23 15
Игорюня, деструктор никаких объектов не удаляет, вообще-то
1
20 / 16 / 11
Регистрация: 07.12.2013
Сообщений: 244
01.02.2014, 12:26  [ТС] 16
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
Игорюня, деструктор никаких объектов не удаляет, вообще-то
А зачем они нужны то?Вы меня запутали.
0
3257 / 2059 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
01.02.2014, 12:27 17
Игорюня, посмотрите внимательно на пример из 11 поста - там явно видно, где именно должно быть удаление объекта.
0
654 / 575 / 164
Регистрация: 13.12.2012
Сообщений: 2,124
01.02.2014, 12:32 18
Лучший ответ Сообщение было отмечено Игорюня как решение

Решение

Цитата Сообщение от Игорюня Посмотреть сообщение
Его не надо удалять в ручную?
Kuzia domovenok, имеет ввиду, что в классе нечего удалять, поэтому писать реализацию конструкторов не обязательно, если бы например в классе был укзатель, и ты при работе с классом выделял память и создавал объекты\массивы, тогда реализация деструктора нужна, а если там там нет указателей, то необходимость самостоятельной реализации деструкторов не обязательна, хотя да при наследовании я думаю необходима, потому что надо показать в каком порядке вызывать деструкторы(из за того что они вирутуальные вызов будет начат с наследника)

Добавлено через 2 минуты
Цитата Сообщение от aLarman Посмотреть сообщение
поэтому писать реализацию конструкторов
деструкторов
0
20 / 16 / 11
Регистрация: 07.12.2013
Сообщений: 244
01.02.2014, 12:33  [ТС] 19
Я так понял,что запутался из-за того,что указатель был не в классе,отсюда и каша.
0
654 / 575 / 164
Регистрация: 13.12.2012
Сообщений: 2,124
01.02.2014, 12:37 20
в мейне Вы же динамически создаете объект, там надо удалять
1
01.02.2014, 12:37
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
01.02.2014, 12:37
Помогаю со студенческими работами здесь

Деструкторы
Вообщем сразу к сути. В нижеприведенном примере вызывается 2 деструктора. Я никак не пойму, почему...

Деструкторы
Всем доброго времени суток! Возникли некоторые непонятки с деструкторами, а точнее их время вызова...

Деструкторы
Не совсем понятно, по какой все таки причине разработчики C++ отказались от возможности иметь...

Конструкторы и деструкторы
Помогите исправить программу. Необходимо реализовать класс с двумя полями, имеющими имена first...

Конструкторы и деструкторы
Здравствуйте!Помогите пожалуйста с решением данной задачи, Буду премного благодарен за оказанную...

Конструкторы и деструкторы
Вопрос по loc2 = copy(loc); (строка 39) 1) вызывается копирующий конструктор X a = loc 2) вот тут...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru