如何从析构函数不是虚拟的基类中正确继承?

xml*_*lmx 1 c++ inheritance virtual-destructor

我想继承A类,但A的析构函数不是虚拟的,我不能修改A的定义.如何避免以下情况?

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?
}
Run Code Online (Sandbox Code Playgroud)

Cha*_*via 8

如果基类没有虚拟析构函数而你无法修改类定义,那么你几乎没有运气.作为一般经验法则,您可能不应该将公共继承与没有虚析构函数的基类一起使用.

也许你可以尝试使用合成而不是继承?放置一个实例AB,并提供包装调用的成员函数公共成员函数A.