Здравствуйте, sanx, Вы писали:
S>Как я понимаю такое невозможно (вот здесь читал http://easy-coding.blogspot.com/2009/09/blog-post.html). Но вот у меня такая задача:
S>class BaseClass
S>{
S>public:
S> ~BaseClass() { Free(); }
S> void Free() { ЧТО-ТО_ОБЩЕЕ_ДЛЯ_ВСЕХ; FreeResource(); }
S>protected:
S> virtual void FreeResource() = 0;
S>};
S>Метод Free нужен публичный, он делает некоторые вещи (по освобождению ресурсов) общие для всех унаследованных классов, и плюс каждый класс должен не забыть реализовать метод освобождения специфических для него ресурсов FreeResource. Но понятно что в деструкторе будет вызываться чисто виртуально абстрактный метод базового класса (FreeResource() = 0). Как быть?
class BaseClass
{
protected:
std::function<void(bool)> clear;//C++0x. или буст тогда
public:
~BaseClass() { Free(true); }
void Free(bool callFromDestructor=false)
{
ЧТО-ТО_ОБЩЕЕ_ДЛЯ_ВСЕХ;
clear(callFromDestructor);
}
};
И инициализировать в конструкторе производного класса. Проблема с неопреленным состоянием после вызова деструктора потомка, правда никуда не денется..