Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 09.09.2011, 17:11   #1
Selestis
Форумчанин
 
Аватар для Selestis
 
Регистрация: 21.01.2009
Сообщений: 719
По умолчанию C++ Вопрос по виртуальным методам

Здравствуйте!

Осваиваю С++ и в данный момент возникла проблема с виртуальным методом.
В упрощенном виде пример выглядит так:
Есть базовый класс
Код:
class Collection
{
	virtual void Clear() = 0;
	virtual ~Collection() {Clear();}
};
и несколько от него унаследованных. Суть вполне тривиальна: каждый наследник переопределяет абстрактный метод очистки Collection, при этом деструктор базового класса должен вызвать этот перопределенный метод. Но при вышеуказанной записи ругается компоновщик...
Пробовал по-другому:
Код:
virtual void Clear() {;}
но тогда вызов не проходит по цепочке наследования(вызывается только базовый пустой Clear() {;}.
Что нужно написать, чтобы добиться желаемого эффекта?

Заранее спасибо.
Изобретатель велосипедов
Selestis вне форума Ответить с цитированием
Старый 09.09.2011, 17:42   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

как ругается то?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 09.09.2011, 17:54   #3
Selestis
Форумчанин
 
Аватар для Selestis
 
Регистрация: 21.01.2009
Сообщений: 719
По умолчанию

"Ссылка на неразрешенный внешний символ ...",
что, очевидно, связано с абстрактностью метода. А абстрактным он остался именно из-за существования описанной проблемы - метод при вызове из базового Collection виртуальным не считается...(
Изобретатель велосипедов
Selestis вне форума Ответить с цитированием
Старый 09.09.2011, 18:08   #4
Rififi
Старожил
 
Регистрация: 19.08.2009
Сообщений: 2,119
По умолчанию

Selestis

вызов не проходит по цепочке наследования(вызывается только базовый пустой Clear() {;}.
Что нужно написать, чтобы добиться желаемого эффекта?


вариантов у тебя ровно DVA:

1. смириться с тем, что вызов виртуальной функции в деструкторе происходит без учёта виртуальности
2. выбрать более другой язык программирования, где такой вызов возможен
Rififi вне форума Ответить с цитированием
Старый 09.09.2011, 18:11   #5
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

хм, действительно не компилит
странно.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.

Последний раз редактировалось Пепел Феникса; 09.09.2011 в 18:13.
Пепел Феникса вне форума Ответить с цитированием
Старый 09.09.2011, 18:18   #6
Selestis
Форумчанин
 
Аватар для Selestis
 
Регистрация: 21.01.2009
Сообщений: 719
По умолчанию

Rififi
Видимо, 1)))
Наверное, придется переопределять деструктор и там для каждого класса вызывать свой Clear...
Но если кто-то что-то всё же сообразит, буду рад.
Изобретатель велосипедов
Selestis вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблема с виртуальным хостом hxt PHP 0 03.11.2010 18:17
По численным методам VovaZZ Общие вопросы C/C++ 0 20.10.2010 17:20
Помогите пожалуйста с виртуальным собеседником BrokenDream Обсуждение статей 1 07.10.2009 08:19
Вопрос Дня по методам С++ Alitrix Общие вопросы C/C++ 4 17.06.2009 09:29
C# доступ к методам класса. Lime Общие вопросы .NET 4 03.03.2009 20:51