您的位置:首页 > 编程语言 > C语言/C++

析构函数为什么要定义成虚析构函数?

2016-12-19 22:36 239 查看
通常,如果想通过指向某个对象基类的指针操纵这个对象(也就是,通过它的一般接口操纵这个对象),会发生什

么现象?当我们用delete用new创建的对象指针时,就会出现这个问题。如果这个指针是指向基类的,在delete期间,编

译器只能知道调用这个析构函数的基类版本。虚函数被创建恰恰是为了解决同样的问题。(除了构造函数以外的所有

函数都可以是虚函数,析构函数可以是虚函数,构造函数不能是虚函数)。

#include<iostream>
using namespace std;

class Base1
{
public:
~Base1(){cout<<"~Base1()"<<endl;}
};

class Derived1:public Base1
{
public:
~Derived1(){cout<<"~Derived1"<<endl;}
};

class Base2
{
public:
virtual ~Base2(){cout<<"Base2()"<<endl;} //虚析构函数;
};

class Derived2:public Base2
{
public:
~Derived2(){cout<<"Derived2()"<<endl;}
};

void main()
{
Base1 *bp=new Derived1;
delete bp;
Base2 *b2p=new Derived2;
delete b2p;
}


当运行这个程序,将会看到delete bp只调用了基类的析构函数,delete b2p调用了派生类的析构函数,然后调用

基类的析构函数。这正是我们希望的。不把析构函数设为虚函数是一个隐匿的错误,因为它常常不会对程序有直接影

响。但它会引起内存泄漏(关闭程序时,内存未释放)。同样的析构操作还有可能掩盖发生的问题。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  C++