I want to inherit from class A, but A's destructor is not virtual and I cannot modify A's definition. How to avoid the following case?
struct A
{
A()
: a(new char[8])
{}
~A()
{
delete[] a;
}
char* a;
}
struct B : A
{
B()
: A(), b(new char[8])
{}
~B()
{
delete[] b;
}
char* b;
};
int main()
{
A* p_a = new B;
delete p_a; // How to avoid such a dangerous deletion?
}
You can use
struct B : private A
so thatA
is an inaccessible base ofB
.Just make the
A
a data member instead of a base class.By the way, the classes violate the rule of three, which is an invitation to disaster. What if an instance is copied. Better use standard library containers instead of explicit
new
anddelete
.If the base class doesn't have a virtual destructor and you can't modify the class definition, you're pretty much out of luck. As a general rule of thumb, you probably shouldn't use public inheritance with a base class that doesn't have a virtual destructor.
Maybe you can try using composition instead of inheritance? Place an instance of
A
inB
, and provide public member functions that wrap calls to member functions ofA
.