1

我想从 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?
}
4

3 回答 3

8

如果基类没有虚拟析构函数并且您无法修改类定义,那么您就很不走运了。作为一般经验法则,您可能不应该对没有虚拟析构函数的基类使用公共继承。

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

于 2013-02-11T04:47:51.910 回答
1

您可以使用struct B : private A这样A一个无法访问的基础B

于 2013-02-11T04:46:20.600 回答
0

只需制作A数据成员而不是基类。


顺便说一句,班级违反了三人制,这是灾难的邀请。如果复制实例怎么办。更好地使用标准库容器而不是显式newdelete.

于 2013-02-11T05:47:42.000 回答