Форум программистов, компьютерный форум CyberForum.ru

Разрушение объектов при наследовании - C++

Восстановить пароль Регистрация
 
htonasral
5 / 5 / 1
Регистрация: 19.05.2009
Сообщений: 23
13.09.2011, 22:43     Разрушение объектов при наследовании #1
Привожу код, вопрос после описания
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
29
30
31
32
33
34
35
36
37
38
39
#include <iostream>
 
using namespace std;
 
class A
{
public:
    A()
    {
        cout<<"A constr"<<endl;
    }
    ~A()
    {
        cout<<"A destr"<<endl;
    }
};
 
class B: public A
{
public:
    B()
    {
        cout<<"B constr"<<endl;
    }
    ~B()
    {
        cout<<"B destr"<<endl;
    }
};
 
 
 
void main()
{
    
    A* a=new B;
    delete a;
    
}
Output:
A constr
B constr
A destr

Вопрос: почему в таком случае не будет вызван деструктор класса В?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
13.09.2011, 22:46     Разрушение объектов при наследовании #2
потому что деструктор не виртуальный
htonasral
5 / 5 / 1
Регистрация: 19.05.2009
Сообщений: 23
13.09.2011, 23:36  [ТС]     Разрушение объектов при наследовании #3
Я знаю что при виртуальном деструкторе все будет работать, но почему, что в этом случае происходит в памяти, почему так выходит??
Gepar
 Аватар для Gepar
1173 / 529 / 20
Регистрация: 01.07.2009
Сообщений: 3,508
13.09.2011, 23:37     Разрушение объектов при наследовании #4
Хм, а я вроде читал в стандарте что должны вызываться деструкторы в обратном порядке к вызову конструкторов независимо от того виртуальные они там или нет.
Net_Wanderer
235 / 208 / 19
Регистрация: 08.06.2011
Сообщений: 467
13.09.2011, 23:43     Разрушение объектов при наследовании #5
Цитата Сообщение от Gepar Посмотреть сообщение
Хм, а я вроде читал в стандарте что должны вызываться деструкторы в обратном порядке к вызову конструкторов независимо от того виртуальные они там или нет.
Так и есть, просто здесь указатель имеет тип A, по этому деструкторы вызываются соответственно типу.
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
13.09.2011, 23:53     Разрушение объектов при наследовании #6
Поскольку деструктор не виртуальный, то он вызовется, как и любая не виртуальная функция, на основе типа указателя, а не типа фактического объекта.
Net_Wanderer
235 / 208 / 19
Регистрация: 08.06.2011
Сообщений: 467
13.09.2011, 23:55     Разрушение объектов при наследовании #7
Цитата Сообщение от htonasral Посмотреть сообщение
почему так выходит??
v-table'a нету, откуда по вашему указатель на A, должен знать, что он на самом деле указывает на B ?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.09.2011, 21:17     Разрушение объектов при наследовании
Еще ссылки по теме:

Создание и разрушение объектов C++
C++ Неоднозначность при наследовании
Деструктор при наследовании C++

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

Или воспользуйтесь поиском по форуму:
Сыроежка
Заблокирован
14.09.2011, 21:17     Разрушение объектов при наследовании #8
Цитата Сообщение от htonasral Посмотреть сообщение
Привожу код, вопрос после описания
Output:
A constr
B constr
A destr

Вопрос: почему в таком случае не будет вызван деструктор класса В?
Потому что компилятор сделал статическое связывание вызова деструктора в соответствии со статическим типом указателя. Не виртуальные функции связываются статически на этапе компиляции.

Если вы хотите, чтобы в вашем примере правильно был удавлен объект, а делать виртуальным деструктор вы не хотите, то вы можете написатьо следующий код

C++
1
2
a->~A();
delete a;
И этот код корректно удалит ваш объект.

Я думаю, больше вопросов должен вызывать мой код, а не ваш! С вашим кодом все просто, не то, что с моим!

Добавлено через 3 минуты
Цитата Сообщение от htonasral Посмотреть сообщение
Привожу код, вопрос после описания
Output:
A constr
B constr
A destr

Вопрос: почему в таком случае не будет вызван деструктор класса В?
Потому что компилятор сделал статическое связывание вызова деструктора в соответствии с типом указателя. Не виртуальные функции связываются статически на этапе компиляции.

Если вы хотите, чтобы в вашем примере правильно был удавлен объект, а делать виртуальным деструктор вы не хотите, то вы можете написатьо следующий код

C++
1
2
a->~A();
delete a;
И этот код корректно удалит ваш объект.

Я думаю, больше вопросов должен вызывать мой код, а не ваш! С вашим кодом все просто, не то, что с моим!

А, скорей всго, я вру! Все равно нужен виртуальный деструктор! Так что мой фокус не проходит.
Yandex
Объявления
14.09.2011, 21:17     Разрушение объектов при наследовании
Ответ Создать тему
Опции темы

Текущее время: 10:19. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru