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

C++虚函数(5) - 虚析构函数

2015-05-26 00:40 134 查看
使用一个指向基类(定义了一个non-virtual析构函数)的指针,来删除一个子类时,会导致未知行为。这种情况下,基类必须定义虚析构函数。

Source: https://www.securecoding.cert.org/confluence/display/cplusplus/OOP34-CPP.+Ensure+the+proper+destructor+is+called+for+polymorphic+objects
例如,下面程序会导致未知行为。

//此程序中基类没有定义虚析构函数,会导致异常行为
#include<iostream>
using namespace std;

class base {
public:
base()
{ cout<<"Constructing base \n"; }
~base()
{ cout<<"Destructing base \n"; }
};

class derived: public base {
public:
derived()
{ cout<<"Constructing derived \n"; }
~derived()
{ cout<<"Destructing derived \n"; }
};

int main(void)
{
derived *d = new derived();
base *b = d;
delete b;
return 0;
}
不同的编译器可能会打印不同结果。下面是visual studio 2015的结果:

Constructing base

Constructing derived

Destructing base

将基类的析构函数定义为virtual后, 就可以确保子类能被正确的析构了。

参考下面例子:

// 使用虚析构函数的例子程序
#include<iostream>
using namespace std;
class base {
public:
base()
{ cout<<"Constructing base \n"; }
virtual ~base()
{ cout<<"Destructing base \n"; }
};

class derived: public base {
public:
derived()
{ cout<<"Constructing derived \n"; }
~derived()
{ cout<<"Destructing derived \n"; }
};

int main(void)
{
derived *d = new derived();
base *b = d;
delete b;
return 0;
}


输出:
Constructing base

Constructing derived

Destructing derived

Destructing base

做为一个原则, 任何时候只有一个类中拥有虚函数,则应该立即给这个类增加一个虚析构函数(尽管它也许不会做什么)。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: