C++虚函数(5) - 虚析构函数
来源:互联网 发布:河南科技大学软件 编辑:程序博客网 时间:2024/05/08 23:13
使用一个指向基类(定义了一个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
做为一个原则, 任何时候只有一个类中拥有虚函数,则应该立即给这个类增加一个虚析构函数(尽管它也许不会做什么)。
0 0
- C/C++--虚函数
- C++-----虚析构函数
- C++----虚析构函数
- C++【浅谈虚析构函数】
- C++_虚析构函数
- 【c++】虚析构函数
- (C++)虚析构函数
- C++---------之--------【虚析构函数】
- C++:虚函数用途
- 虚函数详解(C++)
- 虚函数(C++)
- c++-->虚函数 2
- C++ 虚函数
- C++:虚函数
- C++_虚函数
- 【c++】虚函数
- 【C++】虚函数
- C++ 虚函数
- 从应用启动看Activity的创建过程
- 通过配置设置系统默认的页面web.xml&struts.xml
- 品牌表初始化
- 东莞理工学院是几本?
- windows phone8.1列表显示
- C++虚函数(5) - 虚析构函数
- Linux 用户密码轮询破解
- RNN
- webx ajax 请求
- checkbox复选框的一些深入研究与理解
- Google 的开源技术protobuf 简介与例子
- 高夫数据
- fedora10下的tftp的安装与配置
- 【ZMYC】第1篇:资源更新服务器