Search code examples
c++inheritancevirtual-destructor

How to correctly inherit from a base class whose destructor is not virtual?


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?
}

Solution

  • 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 in B, and provide public member functions that wrap calls to member functions of A.