当你用到多态时,务必把析构函数做成虚函数
以前知道子类的析构函数会自动调用父类的析构函数,然而今天却发现不总是这样。当你用基类的指针指向派生类时,然后delete这个指针时,有可能就不会调用派生类的析构函数。看代码
#include <stdio.h>
class A{
public:
~A(){
printf("A deconstructor\n");
}
};
class B:public A{
~B(){
printf("B deconstructor\n");
}
};
int main()
{
A *p = new B;
delete p;
return 0;
}
这段代码的输出是“A deconstructor ”。它并没有调用派生类的析构函数。这是非常危险的事,资源泄露由此产生。
正确的做法是,将析构函数做成虚函数
#include <stdio.h>
class A{
public:
virtual ~A(){
printf("A deconstructor\n");
}
};
class B:public A{
~B(){
printf("B deconstructor\n");
}
};
int main()
{
A *p = new B;
delete p;
return 0;
}
这段代码的输出是
B deconstructor
A deconstructor
正确的调用了两个类的析构函数,注意,请注意析构函数的调用顺序。这个调用顺序是一个考点,当然也请思考为什么是这个顺序
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)