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

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

Войти
Регистрация
Восстановить пароль
 
monolit
186 / 185 / 22
Регистрация: 24.03.2011
Сообщений: 669
Завершенные тесты: 1
#1

Не срабатывает деструктор и дочернего класса - C++

18.01.2014, 21:09. Просмотров 504. Ответов 5
Метки нет (Все метки)

Собственно, такие дела. Использую наследование, несколько цепочек одного от другого 1->2->3->....
И сегодня неожиданно обнаружил, что у самого дочернего класса деструктор не срабатывает (у непосредственно родителей тоже не срабытывал, может, срабатывал у родителей родителей, но я не проверял). Проблема исчезла, когда я сделал деструктор самого базового класса виртуальным.
Почему так происходит? Раньше я думал, что если деструктор базового не виртуальный, то просто не вызовется - но деструктор дочернего сработает. Ан нет...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.01.2014, 21:09
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Не срабатывает деструктор и дочернего класса (C++):

Преждевременно срабатывает деструктор - C++
Здравствуйте! Не могли бы вы помочь со следующей проблемой: реализую класс матрицы (здесь часть исходников): // Matrix.h ...

Перегрузка оператора >> для дочернего класса от базового виртуального класса - C++
Доброго вам времени суток! Программирую на С++ не давно, в связи с отсутствием должного времени на поиск ответа в глубинах учебников,...

Может ли метод родительского класса обратиться к полю дочернего класса - C++
Может ли метод родительского класса обратиться к полю дочернего класса?

Как построить экземпляр дочернего класса на основе готового экземпляра базового класса? - C++
Если уже есть готовый объект базового класса. Могу я построить экземпляр дочернего на его основе, (напр., получив такой базовый объект...

Инициализация членов дочернего класса членами класса родителя - C++
Есть уже созданный класс-родитель A. Как эффективно инициализировать дочерний класс B членами класса A?

Задачка для новичков #2: вывести в методе класса-родителя значение данных-членов из дочернего класса - C++
Вдохновленный соседней темой тоже решил задать свой вопрос таким же начинающим программистам как и я :) Все кто хочет попробовать дать...

5
MrGluck
Модератор
Эксперт CЭксперт С++
7490 / 4605 / 691
Регистрация: 29.11.2010
Сообщений: 12,589
18.01.2014, 21:11 #2
По стандарту:
In the first alternative (delete object), if the static type of the operand is different from
its dynamic type, the static type shall be a base class of the operand's dynamic type and
the static type shall have a virtual destructor or the behavior is undefined.
http://habrahabr.ru/post/64280/

Добавлено через 29 секунд
И важно помнить, что по умолчанию (без явного объявления) деструктор виртуальным не является.
1
alsav22
5426 / 4821 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
18.01.2014, 21:13 #3
Указателями на базовый класс оперируете?
1
MrGluck
Модератор
Эксперт CЭксперт С++
7490 / 4605 / 691
Регистрация: 29.11.2010
Сообщений: 12,589
18.01.2014, 21:49 #4
Цитата Сообщение от alsav22 Посмотреть сообщение
Указателями на базовый класс оперируете?
иначе бы проблемы не возникло
0
monolit
186 / 185 / 22
Регистрация: 24.03.2011
Сообщений: 669
Завершенные тесты: 1
18.01.2014, 22:13  [ТС] #5
Т.е. у меня срабатывал деструктор самого базового класса (да, указателями на объекты такого типа я и оперировал), верно? Проверить настолько глубоко у меня руки не дошли) Спасибо за ответы.
0
alsav22
5426 / 4821 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
18.01.2014, 22:49 #6
Цитата Сообщение от monolit Посмотреть сообщение
Т.е. у меня срабатывал деструктор самого базового класса (да, указателями на объекты такого типа я и оперировал),
Деструктор - один из методов класса. Когда делается вызов метода класса, через указатель на базовый класс, связанный с объектом производного, и этот метод не виртуальный, то будет вызван метод базового класса (по типу уазателя), если метод виртуальный, то будет вызван метод производного класса (по типу объекта).
1
18.01.2014, 22:49
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.01.2014, 22:49
Привет! Вот еще темы с ответами:

Как правильно использовать деструктор? Он слишком рано срабатывает - C++
#include "stdafx.h" #include <iostream> using namespace std; class MyArray { int *ptrarray; //массив int...

Как вызвать виртуальную функцию из дочернего класса, если она определена и вызывается в конструкторе РОДИТЕЛЬСКОГО класса? - C++
Ну то есть так: есть родительский и дочерний класс, в родительском определен виртуальная функция и вызывается в его конструкторе (камень...

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

Почему деструктор срабатывает больше раз, чем количество созданных объектов? - C++
Вопрос в заголовке темы. Почему? Создается всего 2 объекта, но деструктор вызывается трижды. Вот пример #include <iostream> #include...


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

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

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