How to correctly inherit from a base class whose d

2019-07-29 09:16发布

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

3条回答
Explosion°爆炸
2楼-- · 2019-07-29 09:52

You can use struct B : private A so that A is an inaccessible base of B.

查看更多
小情绪 Triste *
3楼-- · 2019-07-29 09:59

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 and delete.

查看更多
爷的心禁止访问
4楼-- · 2019-07-29 10:00

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.

查看更多
登录 后发表回答