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

时间:2013-02-11 04:43:27

标签: 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?
}

3 个答案:

答案 0 :(得分:8)

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

也许您可以尝试使用合成而不是继承?在A中放置B的实例,并提供包含对A的成员函数的调用的公共成员函数。

答案 1 :(得分:1)

您可以使用struct B : private A,以便A无法访问B

答案 2 :(得分:0)

只需使A成为数据成员而不是基类。


顺便说一下,这些课程违反了三级规则,这是对灾难的邀请。如果复制实例该怎么办?更好地使用标准库容器而不是显式newdelete