析构函数为虚函数
来源:互联网 发布:淘宝热门工具在哪里 编辑:程序博客网 时间:2024/06/06 02:51
编码实现C++类的时候,一般都会把析构函数定义为虚函数,不管这个类是基类还是继承类。
先代码实验
1.析构函数为非虚构
#include <iostream>using namespace std;class CBase{public: CBase(){} ~CBase(){cout << "base destructor" << endl;}};class CDerived : public CBase{public: CDerived(){} ~CDerived(){cout << "derived destructor" << endl;}};int main(){ CDerived* cd = new CDerived(); delete cd; cout << "-----------------" << endl; CBase* cb = new CBase(); delete cb; cout << "-----------------" << endl; CBase* p = new CDerived(); delete p;<pre name="code" class="html"> return 0;}
运行结果:
derived destructorbase destructor-----------------base destructor-----------------base destructor可以发现,使用多态的时候,出问题了。
2.析构函数为虚函数
#include <iostream>using namespace std;class CBase{public: CBase(){} virtual ~CBase(){cout << "base destructor" << endl;}};class CDerived : public CBase{public: CDerived(){} ~CDerived(){cout << "derived destructor" << endl;}};int main(){ CDerived* cd = new CDerived(); delete cd; cout << "-----------------" << endl; CBase* cb = new CBase(); delete cb; cout << "-----------------" << endl; CBase* p = new CDerived(); delete p;<pre name="code" class="html"> return 0;}
derived destructorbase destructor-----------------base destructor-----------------derived destructorbase destructor这就正常了。
3.原因
对于
CDerived* cd = new CDerived();delete cd;指针cd指向CDerived对象,调用CDerived类的析构函数,因为析构了继承类,所以,之后会析构基类
对于
CBase* cb = new CBase();delete cb;指针cb指向CBase类的对象,调用CBase类的析构函数。
对于
CBase* p = new CDerived();delete p;基类使用虚析构函数时,动态联编,指针指向的是CDerived类的对象,调用CDerived类的析构函数,因为析构了继承类,所以,之后会析构基类
基类没使用虚析构函数时,静态联编,指针指向CBase类的对象,调用CBase类的析构函数。就不会调用继承类的析构函数了。
0 0
- 析构函数声明为虚函数
- 析构函数定义为虚函数
- 析构函数定义为虚函数
- 析构函数为虚函数
- 析构函数 设置为虚函数
- 析构函数为虚函数
- 析构函数定义为虚函数
- 析构函数声明为虚函数
- 析构函数为虚函数
- c++ 析构函数为虚函数
- 构造函数、析构函数为虚函数的区别
- 构造函数析构函数是否为虚函数
- 构造函数不能为虚函数,析构函数可以为虚函数
- 构造函数不能为虚函数,析构函数可以为虚函数
- 构造函数不能为虚函数,析构函数能并且应该为虚函数
- 为什么构造函数不能声明为虚函数,析构函数可以声明为虚函数
- 将析构函数设置为虚函数,并且析构函数可以为纯虚函数
- 构造函数不能为虚函数,析构函数要为虚函数
- LeetCode83——Remove Duplicates from Sorted List
- 第十章数组和指针 p267
- hdu5612Baby Ming and Matrix games 搜索
- R6010错误:Press Retry to debug the application
- 线程池的四个中断策略
- 析构函数为虚函数
- hdu5613 Baby Ming and Binary image
- 统计学习方法第三章笔记——k近邻法
- 探索推荐引擎内部的秘密,第 2 部分: 深入推荐引擎相关算法 - 协同过滤
- UGUI- Image拦截Button响应事件
- centos7 防火墙firewalld
- android的Gradle学习目录总结
- CSS创建三角形(小三角)的几种方法
- Android中显式和隐式intent的特点和区别