Effective C++条款07解读:为多态基类声明virtual析构函数 (某公司招聘面试试题)
来源:互联网 发布:js onload是什么事件 编辑:程序博客网 时间:2024/06/02 07:09
经历过某同一家公司的两次面试, 都被问到了基类虚析构函数问题, 其实, 很简单很基础。 下面我们来看程序:
#include <iostream>using namespace std;class A{public:~A(){cout << "~A" << endl;}};class B : public A{public:~B(){cout << "~B" << endl;}};int main(){A *p = new B;return 0;}结果A,B的析构函数都不会被调用到。 继续看:
#include <iostream>using namespace std;class A{public:~A(){cout << "~A" << endl;}};class B : public A{public:~B(){cout << "~B" << endl;}};int main(){A *p = new B;delete p;return 0;}结果为:~A
好, 继续看:
#include <iostream>using namespace std;class A{public:virtual ~A(){cout << "~A" << endl;}};class B : public A{public:~B(){cout << "~B" << endl;}};int main(){A *p = new B;delete p;return 0;}结果为:
~B
~A
可见, 应该为多态基类声明virtual析构函数, 否则调用不到派生类的析构函数, 容易造成资源泄露。
当然, 并不是所有基类的存在都是为了派生、多态的, 比如STL的string类, 所以标准string是不含virtual函数的。 那怎么验证string的析构函数不是virtual函数呢? 很简单, 且看:
#include <iostream>#include <string>using namespace std;class Test : public string{public:~Test(){cout << "~Test" << endl;}};int main(){string *p = new Test;delete p;return 0;}从结果看, 没有调用到Test的析构函数。 其实呢, 让一个类去继承string, 这是个很馊很馊的主意。
OK, 本文先介绍到这里。
0 0
- Effective C++条款07解读:为多态基类声明virtual析构函数 (某公司招聘面试试题)
- 《Effective C++》学习笔记条款07 为多态基类声明virtual析构函数
- Effective C++:条款07:为多态基类声明virtual析构函数
- [Effective C++]条款07 为多态基类声明virtual析构函数
- Effective C++--条款07:为多态基类声明virtual析构函数
- 读书笔记《Effective C++》条款07:为多态基类声明virtual析构函数
- effective c++ 条款07(为多态基类声明virtual析构函数)整理
- Effective C++——》条款7:为多态基类声明virtual析构函数 .
- Effective c++(第三版) 条款7:为多态基类声明virtual析构函数
- Effective C++学习7 条款07:为多态基类声明virtual析构函数
- Effective c++学习笔记——条款07:为多态基类声明virtual析构函数
- Effective c++学习笔记——条款07:为多态基类声明virtual析构函数
- Effective C++ 条款07 为多态基类声明virtual 析构函数
- effective C++ 读书笔记 条款07 为多态基类声明virtual析构函数
- Effective C++学习笔记 条款07:为多态基类声明virtual析构函数
- 《Effective C++读书笔记》--条款07:为多态基类声明virtual析构函数
- (原文)Effective C++条款7:为多态基类声明VIRTUAL析构函数
- 条款07:为多态基类声明virtual析构函数
- Lovo 6月17号课程总结
- iOS 基础学习(8)----iOS 新建一个对象
- 购物车前端开发
- 文章标题
- struts三种传入后台值的方式
- Effective C++条款07解读:为多态基类声明virtual析构函数 (某公司招聘面试试题)
- delphi Service里Shellexecute打开cmd返回ERROR_ACCESS_DENIED(权限不足)
- Oracle 在字符串中输入单引号或特殊字符
- 输入子系统之典型源码分析
- 存储过程的学习
- 每天一个linux命令(35):ln 命令
- SAE如何绑定域名到子目录
- linux程序设计——CD唱片应用程序(第七章)
- 黑马程序员------String、正则及常用类