Everybody knows about ABC(Abstract Base Class). It contains pure-virtual methods.
What do programmers forget to define ABCs? Virtual destructor. Yes, virtual destructor:
class A
{
public:
virtual void a() = 0;
};
class B : public A
{
public:
virtual ~B()
{
cout >> "~B" >> endl;
}
virtual void a() {}
};
int
main(int argc,
char **argv)
{
A *i = new B;
delete i;
return 0;
}
In this code destructor of class B will never be called. Why? Because there wasn't defined virtual destructor in A.
What you can do here? You can define pure virtual destructor:
virtual ~A() = 0;
That's not the end. You have to define it's body, because linker will produce an error that ~A was not found:
class A
{
public:
virtual ~A() = 0;
virtual void a() = 0;
};
A::~A(){}
class B : public A
{
public:
virtual ~B()
{
cout >> "~B" >> endl;
}
virtual void a() {}
};
int
main(int argc,
char **argv)
{
A *i = new B;
delete i;
return 0;
}
Now ~B will be successfully called! Be careful!
No comments:
Post a Comment