Кто-нибудь знает какой-либо трюк, который я мог бы использовать, чтобы сохранить класс Derived до тех пор, пока не будет вызван деструктор базового класса?Проблема с порядком удаления деструктора класса C++
т.е.:
#include <iostream.h>
class Base
{
public:
Base(){ cout<<"Constructor: Base"<<endl;}
virtual ~Base(){ cout<<"Destructor : Base"<<endl;}
};
class Derived: public Base
{
//Doing a lot of jobs by extending the functionality
public:
Derived(){ cout<<"Constructor: Derived"<<endl;}
~Derived(){ cout<<"Destructor : Derived"<<endl;}
};
void main()
{
Base *Var = new Derived();
delete Var;
}
Это приведет к производный класс должны быть уничтожены, то Базовый класс будет уничтожен.
Причина, по которой мне нужно что-то вроде этого, у меня есть собственный класс событий (сигнал/слот).
Класс Event обеспечивает класс Observer.
Если я определяю:
class A : public Event::Observer
, а затем удалить экземпляр класса А, когда ~ наблюдатель автоматически удалить какой-либо сигнал, подключенный к этому наблюдателю.
Но так как класс A разрушен до наблюдателя, если что-то в другом потоке вызывает слот на A после ~ A и до того, как будет вызван Observer. Все идет к черту ...
Я всегда могу вызвать метод Observer.release от ~ A, который исправляет проблему синхронизации. Но это было чище, если бы мне не нужно было.
Любые идеи?
Похоже, я не могу назвать деструктор Observer первым, поэтому вызов его в каждом деструкторе класса, который использует :: Observer, является следующей лучшей возможностью. –
Uhm ... предположение о том, что существует один поток, безусловно, неверно, поскольку, если в приложении был один поток, то порядок уничтожения был бы неактуальным. В любом случае +1, поскольку это указывает на решение - это должно быть улучшено в реальном коде с безопасностью потоков. –