为什么析构函数最好是虚函数?
来源:互联网 发布:telnet ip 端口号 编辑:程序博客网 时间:2024/06/04 20:26
为了当用一个基类的指针删除一个派生类的对象时,派生类的析构函数会被调用。
直接上源代码来说明:
class Base{public: Base() { printf("B,"); } virtual ~Base() { printf("~B,"); }};class Derived : public Base{public: Derived() { printf("D,"); } virtual ~Derived() { printf("~D,"); } };
尽管~Derived与~Base拼写有误,但只要~Base指明virtual,~Derived中的该关键字可缺省,
所以,只需基础的析构函数声明为virtual即可,当然继承类再指定一下更明确放心。
(1)当指针类型与实例类型不一致时,就看出问题:
Base *d = new Derived(); delete d; //注意此处:父类指针,指向子类实例
有virtual时,输出为:B,D,~D,~B,
无virtual时,输出为:B,D,~B, 问题就在这里:此时继承类的析构函数(释放内存、收尾处理等操作)没有被调用!
Derived *d = new Base(); delete d; //不安全用法,仅为测试
有virtual时输出:B,~B,
无virtual时输出:B,~D,~B,
(2)当指针类型与实例类型一致时,体现不出问题:
Base *d = new Base(); delete d;
无论是否有virtual,输出都为:B,~B,
Derived *d = new Derived(); delete d;
无论是否有virtual,输出都是:B,D,~D,~B,
- 为什么析构函数最好是虚函数?
- C++中,为什么构造函数不能够是虚函数,而析构函数可以是虚函数,而且最好是虚函数
- 为什么析构函数是虚函数
- 析构函数为什么是虚函数
- 为什么析构函数是虚函数
- 为什么构造函数不可以声明为虚函数,而析构函数最好声明为虚函数
- 基类的析构函数为什么是虚函数?
- 基类的析构函数为什么是虚函数
- 为什么基类的析构函数是虚函数
- 为什么基类的析构函数是虚函数?
- 为什么基类的析构函数是虚函数?
- 析构函数为什么一般是虚函数
- 为什么析构函数常常是虚函数
- 为什么基类的析构函数是虚函数
- 为什么基类的析构函数是虚函数?
- 为什么基类的析构函数是虚函数?
- 基类的析构函数为什么是虚函数?
- 为什么基类的析构函数是虚函数?
- 什么是CSQA(注册软件质量保证师)国际认证?
- 第07章 图形操作 · 7.2 绘制图形(1)
- Jquery 仿淘宝京东多条件筛选 可自行结合ajax加载
- 第07章 图形操作 · 7.2 绘制图形(2)
- 二叉树的深度 Java
- 为什么析构函数最好是虚函数?
- 传智特刊第三季——应届生何必去走两年弯路人生……
- extjs combobox setValue 显示问题
- MFC中绘图的几种方式
- Word 页脚处理
- Oracle 的6中约束
- 千万级并发实现的秘密:内核不是解决方案,而是问题所在!
- 计算单链表的节点数
- 浅谈JSP自定义标签实现过程