我有两个班级:
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
我不知道这个错误是什么......在博客的某个地方,我读到这是一个编译器警告。我该如何解决这个问题?
答案 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 指针/引用,就可以防止内存泄漏