![]() |
|
Модераторы: bsa |
![]()
|
|
| lv151 |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 916 Регистрация: 11.2.2008 Репутация: нет Всего: 2 |
в проге:
Не вызывается деструктор наследника, что посоветуете? |
||||
|
|||||
| andrew_121 |
|
|||
![]() Кодофей ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3448 Регистрация: 3.1.2008 Репутация: 10 Всего: 33 |
lv151, А где деструкторы?
-------------------- Удалил аккаунт. Прощайте! |
|||
|
||||
| lv151 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 916 Регистрация: 11.2.2008 Репутация: нет Всего: 2 |
Это сообщение отредактировал(а) lv151 - 23.7.2009, 09:29 |
|||
|
||||
| andrew_121 |
|
|||
![]() Кодофей ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3448 Регистрация: 3.1.2008 Репутация: 10 Всего: 33 |
lv151, А у него тело есть?
Покажи лучше полный пример. Чтоб компилировался. -------------------- Удалил аккаунт. Прощайте! |
|||
|
||||
| zim22 |
|
|||
|
depict1 ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2682 Регистрация: 15.1.2009 Где: Украина Репутация: 29 Всего: 69 |
определить виртуальный деструктор в базовом классе, а не в производном |
|||
|
||||
| lv151 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 916 Регистрация: 11.2.2008 Репутация: нет Всего: 2 |
Всем спасибо! Это сообщение отредактировал(а) lv151 - 23.7.2009, 10:09 |
|||
|
||||
| andrew_121 |
|
|||
![]() Кодофей ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3448 Регистрация: 3.1.2008 Репутация: 10 Всего: 33 |
Странно что его там нет. -------------------- Удалил аккаунт. Прощайте! |
|||
|
||||
| baldman88 |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 210 Регистрация: 18.1.2009 Репутация: 1 Всего: 7 |
Извиняюсь за такой вопрос, но разве в MyClass1 функцию Fun1 и деструктор нужно объявлять виртуальными (если от него ничего не наследуется) ???
|
|||
|
||||
| Gordon |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 459 Регистрация: 9.7.2006 Репутация: 1 Всего: 6 |
Ну, главное чтобы в базовом были виртуальными. Добавлено @ 10:54 Если вот так написать:
В обоих случаях деструкторы будут вызываться корректно... Это сообщение отредактировал(а) Gordon - 23.7.2009, 10:58 -------------------- |
||||
|
|||||
| zim22 |
|
|||
|
depict1 ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2682 Регистрация: 15.1.2009 Где: Украина Репутация: 29 Всего: 69 |
хочу добавить: они будут вызыываться корректно потому что в базовом классе деструктор был объявлен с помощью ключевого слова virtual. Это значит, что в производных классах все деструкторы также становятся virtual независисимо от того, указываем ли мы это явно (т.е. приписываем слово virtual) или просто пишем без него. Слово virtual в производных классах больше предназначено для людей, читающих код, чем для компилятора.
"виртуальным" деструктор и так уже будет в производном классе, хотите вы этого или нет, т.к. класс MyClass1 наследуется от базового класса IIn, в котором уже есть виртуальный деструктор. Это сообщение отредактировал(а) zim22 - 23.7.2009, 11:29 |
|||
|
||||
| Gordon |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 459 Регистрация: 9.7.2006 Репутация: 1 Всего: 6 |
Да!
В производных классах больше для людей... ))) -------------------- |
||||
|
|||||
| zim22 |
|
|||
|
depict1 ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2682 Регистрация: 15.1.2009 Где: Украина Репутация: 29 Всего: 69 |
||||
|
||||
| Gordon |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 459 Регистрация: 9.7.2006 Репутация: 1 Всего: 6 |
А вот здесь интересно, сами деструкторы (а еще конструкторы, operator= и функции-друзья, вроде дак) не наследуются, а их (еструкторов) виртуальность наследуется... Так ведь получается? -------------------- |
|||
|
||||
| zim22 |
|
|||
|
depict1 ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2682 Регистрация: 15.1.2009 Где: Украина Репутация: 29 Всего: 69 |
да, так. наследуется виртуальность деструктора и функций-членов. |
|||
|
||||
| baldman88 |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 210 Регистрация: 18.1.2009 Репутация: 1 Всего: 7 |
С деструкторами разобрался(вроде как) -- получается объявление виртуального деструктора(в базовом классе), гарантирует вызов корректного деструктора в любом случае(при обращении через указатель на базовый класс). Ну а как быть с обычными функциями-членами(например Fun1)? Разве virtual не переопределяет её, то есть если класс MyClass2 будет наследником MyClass1, какая функция будет в нём вызванна -- из базоваго класса или же из MyClass1 ?
|
|||
|
||||
| zim22 |
|
|||
|
depict1 ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2682 Регистрация: 15.1.2009 Где: Украина Репутация: 29 Всего: 69 |
||||
|
||||
| Gordon |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 459 Регистрация: 9.7.2006 Репутация: 1 Всего: 6 |
Если в MyClass2 будет определена "Fun1", то для объектов класса MyClass2 вызываться будет она, даже если будешь работать через указатель на MyClass1 или на "более базовый" класса... (для чего же тогда виртуальность?) А если в MyClass2 не будет определена "Fun1", то по идеи будет вызвана "Fun1" из "ближайшего родителя" в котором она определена...
Это сообщение отредактировал(а) Gordon - 23.7.2009, 13:13 -------------------- |
|||
|
||||
![]()
|
| Правила форума "C/C++: Для новичков" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |