C++-C++的面向对象在什么情况下需要将析构函数定义成虚函数?

发布于 2017-01-18 20:00:46 字数 126 浏览 1206 评论 3

可能重复的问题
虚析构函数的与虚函数表的问题~

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

想挽留 2017-10-20 09:03:39

当这个类作为基类时,目的是为了提供释放子类自己的资源

晚风撩人 2017-08-24 01:55:11

这个类是基类的话,一般情况下都要把析构函数声明为虚的。防止派生类在构造时,或者其他地方申请了资源,在析构函数里释放资源。如果不是虚析构函数的话,有可能会调用不到派生类的析构函数,而使资源得不到释放。举例

class A
{
public:
void show(){cout<<"A::show"<<endl;}
~A() {cout<<"~A()n";}
};

class B: public A
{
public:
B() { ptr = new int[20];}
void show(){cout<<"B::show"<<endl;}
~B() {cout<<"~B()n"; delete []ptr;}
private:
int* ptr;
};

int main()
{
A* p = new B;
delete p; //没有调用到B的析构函数,内存泄漏
return 0;
}

泛泛之交 2017-08-07 05:59:24

作为一般规则,我们建议将类层次结构的基类(声明了一个或者多个虚拟函数)的析构函数声明为虚拟的。这样在用delete释放该资源的时候,析构函数会被正确调用。

在继承机制下的类的析构函数的行为如下:派生类的析构函数先被调用。完成之后,直接基类的析构函数被静态调用。

参考:
要将多态基类的析构函数声明为虚函数(Effective C++ )

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文