19

我有两节课:

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

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

4

4 回答 4

25

发生这种情况是因为您的基类A没有虚拟析构函数。例如,如果您有以下代码:

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

然后delete a调用将无法调用B' 的析构函数,因为A' 不是虚拟的。(它会泄漏所有B的资源。)您可以在此处阅读有关虚拟析构函数的更多信息。

向您的基类添加一个虚拟析构函数,您应该没问题。

class A
{
public:  
    virtual void somefunction() = 0;
    virtual ~A() = default;
}
于 2011-04-29T04:09:00.797 回答
7

给A类:

virtual ~A() { }

这样,如果您delete通过A*.

于 2011-04-29T04:09:23.730 回答
4

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

于 2012-05-10T12:50:33.573 回答
2

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

于 2011-04-29T04:10:04.447 回答