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

时间:2011-04-29 04:05:49

标签: c++ virtual-destructor

我有两个班级:

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 个答案:

答案 0 :(得分:19)

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

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

然后delete a调用将无法调用B的析构函数,因为A不是虚拟的。 (它会泄漏所有B的资源。)你可以read more about virtual destructors here

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

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

答案 1 :(得分:6)

给A班:

virtual ~A() { }

这样,如果你通过delete A*传递它们,那么像B这样的派生类仍然会调用它们的自定义析构函数。

答案 2 :(得分:3)

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

答案 3 :(得分:2)

作为拇指规则(IMHO)或简称,基类中的析构函数必须是公共的和虚拟的,或者是非虚拟的,以防止内存泄漏。通过这样做析构函数派生类被调用,只要删除保存派生地址/参考的Base 指针/引用,就可以防止内存泄漏