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

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
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?
}


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

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


您可以使用struct B : private A使AB的不可访问的基础。


只需将A设置为数据成员而不是基类。

顺便说一下,这些类违反了三原则,这是一种灾难的邀请。如果一个实例被复制了怎么办?最好使用标准库容器,而不是显式的newdelete