I need to declare finalizing method finalize() for all descendants of the base class Base, that should be called during destruction, and my intent was to call pure virtual void Base::finalize() = 0 from the ~Base(), but c++ forbids such a thing. So my question is
How can we oblige descendants to do some finalizing work in right and preliminary defined way?
That code cannot be compiled:
#include <QDebug>
class Base {
public:
Base(){}
virtual ~Base(){
qDebug("deleting b");
finalize();
}
virtual void finalize() = 0;
};
class A : public Base
{
public:
A(){}
~A(){}
void finalize(){qDebug("called finalize in a");}
};
int main(int argc, char *argv[])
{
Base *b = new A;
delete b;
}
If I make Base::finalize() not pure virtual, it is called from ~Base() without dispatching to child since it have been already destructed.
I can call finalize() from child’s destructor but question is how to force to do that. In other words my question is: is it possible to oblige people who will write descendants of the Base class to use finalizing method, well, in another way than commenting it in a documentation? 🙂
Destructors are the right place to release acquired resources, but each class is responsible to release its own resources. Resources acquired by
class Ashould not (and just can not) be released byclass Base.Defining virtual destructors allows
class A‘s destructor to be called when deleting a pointer toclass Basepointing to aclass AobjectSo to achieve proper resource release you just have to release each class’ resources in its own destructor.