Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
htonasral
5 / 5 / 1
Регистрация: 19.05.2009
Сообщений: 23
#1

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

13.09.2011, 22:43. Просмотров 858. Ответов 7
Метки нет (Все метки)

Привожу код, вопрос после описания
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

Вопрос: почему в таком случае не будет вызван деструктор класса В?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.09.2011, 22:43
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Разрушение объектов при наследовании (C++):

Удаление объектов при наследовании - C++
Ребят, объясните такую штуку. Как-то пропустил элементарное. Foo - базовый класс Bar - наследник const size_t N = 1; ...

Подсчитать количество создаваемых объектов при наследовании - C++
Нужно подсчитывать отдельно количество объектов для каждого из классов. Но как это сделать? При наследовании создаётся сначала базовый...

Создание и разрушение объектов - C++
помогите пожалуйста в проблемке- Написать программу, в которой создаются и разрушаются объекты, определенного пользователем класса....

Создание и разрушение объектов класса, исследование вызовов конструкторов и деструкторов - C++
Здравствуйте! Проверте пожалуйста код и подскажите мои ошибки. Согласно теме необходимо разобрать класс библиотека(имя – char*, автор –...

Использование шаблонов при наследовании, ошибка при компиляции - C++
При изучении списков написал шаблон протестировал, все работает. После написал класс наследник от шаблона List.h, компилятор выдает...

С++ течет при наследовании - C++
Если был создан класс где его поля размещались в стеке (Foo) и унаследован классом (Foo1) который создается динамически. Как...

7
Jupiter
Каратель
Эксперт С++
6561 / 3982 / 227
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
13.09.2011, 22:46 #2
потому что деструктор не виртуальный
0
htonasral
5 / 5 / 1
Регистрация: 19.05.2009
Сообщений: 23
13.09.2011, 23:36  [ТС] #3
Я знаю что при виртуальном деструкторе все будет работать, но почему, что в этом случае происходит в памяти, почему так выходит??
0
Gepar
1178 / 534 / 20
Регистрация: 01.07.2009
Сообщений: 3,517
13.09.2011, 23:37 #4
Хм, а я вроде читал в стандарте что должны вызываться деструкторы в обратном порядке к вызову конструкторов независимо от того виртуальные они там или нет.
0
Net_Wanderer
235 / 208 / 19
Регистрация: 08.06.2011
Сообщений: 467
13.09.2011, 23:43 #5
Цитата Сообщение от Gepar Посмотреть сообщение
Хм, а я вроде читал в стандарте что должны вызываться деструкторы в обратном порядке к вызову конструкторов независимо от того виртуальные они там или нет.
Так и есть, просто здесь указатель имеет тип A, по этому деструкторы вызываются соответственно типу.
0
silent_1991
Эксперт С++
4989 / 3046 / 149
Регистрация: 11.11.2009
Сообщений: 7,028
Завершенные тесты: 1
13.09.2011, 23:53 #6
Поскольку деструктор не виртуальный, то он вызовется, как и любая не виртуальная функция, на основе типа указателя, а не типа фактического объекта.
0
Net_Wanderer
235 / 208 / 19
Регистрация: 08.06.2011
Сообщений: 467
13.09.2011, 23:55 #7
Цитата Сообщение от htonasral Посмотреть сообщение
почему так выходит??
v-table'a нету, откуда по вашему указатель на A, должен знать, что он на самом деле указывает на B ?
0
Сыроежка
Заблокирован
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;
И этот код корректно удалит ваш объект.

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

А, скорей всго, я вру! Все равно нужен виртуальный деструктор! Так что мой фокус не проходит.
1
14.09.2011, 21:17
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.09.2011, 21:17
Привет! Вот еще темы с ответами:

Неоднозначность при наследовании - C++
Привет народ, думаю мой вопрос покажется вам чем-то из разряда &quot;лучше бы делом занялся&quot;, но тех у кого останется терпение, прошу помочь мне...

Деструктор при наследовании - C++
Имеется 3 класса (базовый -&gt; производный -&gt; производный2) в классе базовый имеется переменная char* var; в производном тоже есть 1...

Конструкторы при наследовании - C++
Описал большую иерархию классов. Надо написать конструкторы, правда уже не очень понимаю как в Си писать конструкторы, к тому же при...

Конструкторы при наследовании - C++
Добрый вечер. Пишу программу с наследованием классов. Класс-родитель - nasled, производный от него - steck. Когда пытаюсь вызвать...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.