类具有虚函数和可访问的非虚析构函数

class has virtual functions and accessible non-virtual destructor

本文关键字:访问 析构函数 函数      更新时间:2023-10-16

我有两个类:

class A {
public:
    virtual void somefunction() = 0;
};
class B : public A {
public:
    B();
    ~B();
    void somefunction();
};
B::B() {}
void B::somefunction() {
    //  some code
}

但是使用g++我得到错误:

class A has virtual functions and accessible non-virtual destructor
class B has virtual functions and accessible non-virtual destructor

我不知道这个错误是什么…我在博客上读到这是一个编译器警告。我该如何解决这个问题?

这是因为您的基类A没有虚析构函数。例如,如果您有这样的代码:

int main()
{
    A* a = new B;
    delete a;
}

delete a调用不能调用B的析构函数,因为A的析构函数不是虚函数。(这会泄漏B的所有资源。)你可以在这里阅读更多关于虚析构函数的信息。

在基类中添加虚析构函数,应该就没问题了。

class A
{
public:  
    virtual void somefunction() = 0;
    virtual ~A() = default;
}

给出class A:

virtual ~A() { }

这样,如果您通过A* delete派生类(如B),它们的自定义析构函数仍然会被调用。

作为经验法则(IMHO),或者简而言之,基类中的析构函数必须是公共和虚拟的,或者是受保护的非虚拟的,以防止内存泄漏。通过这样做,派生类的析构函数被调用,这可以防止在删除保存派生地址/引用的基指针/引用内存泄漏

如果一个类有虚函数,那么它的析构函数也应该是虚函数。你的函数有一个可访问的析构函数,但它不是虚函数。