当一个类作为其他类的基类时,它的析构函数应该加上virtual。
#define debug qDebug()<<
class A
{
public:
virtual ~A()
{
debug "A 析构";
}
};
class B : public A
{
public:
~B()
{
debug "B 析构";
}
};
int main(int argc, char *argv[])
{
A * a = new B;
delete a;
debug "------------";
a = new A;
delete a;
}
当析构函数不加上virtual时,基类指针指向派生类delete时,派生类部分部分清除造成内存泄漏。加上virtual之后,当要调用基类的析构函数时,编译器会从虚函数表中找到要执行的正确的函数地址,即B的析构函数。