Effective C++ 条款7——为多态基类声明virtual析构函数
来源:互联网 发布:js国籍选择插件 csdn 编辑:程序博客网 时间:2024/05/16 15:56
本章节就在强调一件事情,如果一个类是基类,且用于多态,那么该base class的析构函数,要写成virtual 的。如果其不是base class 或不用于多态就不要用virtual析构了。
注:多态就是基类指针指向子类对象。
可这是为什么呢?
若
class TimeKeeper{public:TimeKeeper();~TimeKeeper();.....};class AtomicClock:public TimeKeeper{....}; //原子钟class WaterClock:public TimeKeeper{....}; //水钟class WristWatch:public TimeKeeper{....}; //腕表
有时只是想知道时间,不去理会通过什么得到的时间那么
TimeKeeper *getTimeKeeper();//该函数返回一个指针,指向一个子类对象,如return AtomicClock *ac;TimeKeeper *ptk=getTimeKeeper();...delete ptk;
那么现在就是一个子类对象经由一个基类指针删除delete。这就会发生问题,会造成局部销毁。对象 内的AtomicClock成分可能没有被销毁,而base class部分被销毁了。
只要 将基类的析构函数改为 virtual ~TimeKeeper();即可。因为virtual允许子类的实现得以客制化。
在这章节提到了新概念,虚拟函数表也就是说若一个类含有virtual函数,那么其对象成分中就会含有一个指针vptr,指向这个虚拟函数表vbtl,这个vbtl就是一个函数指针构成的数值,这些指针指向虚拟函数。注vbtl[0]指向的是类型信息,对此要详细了解可以看看“深度探索C++对象模型”讲的很好。
本章节还强调一点:不要无端的将所有class的析构函数声明为virtual。原因1、增加对象大小,2、与其他语言的结构不同(如C,其没有vbtl),不便移植。
当然那些不用于多态的基类,也不要声明为析构为virtural,没有意义。
0 0
- Effective C++——》条款7:为多态基类声明virtual析构函数 .
- Effective C++ 条款7——为多态基类声明virtual析构函数
- Effective c++(第三版) 条款7:为多态基类声明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++》条款07:为多态基类声明virtual析构函数
- Effective C++学习7 条款07:为多态基类声明virtual析构函数
- (原文)Effective C++条款7:为多态基类声明VIRTUAL析构函数
- 条款7:为多态基类声明VIRTUAL析构函数
- 条款7:为多态基类声明virtual析构函数
- 条款7:为多态基类声明virtual析构函数
- 条款7:为多态基类声明virtual析构函数
- 条款7 为多态基类声明virtual析构函数
- 条款7:为多态基类声明virtual析构函数
- android将res中的资源拷贝到SD卡中
- 字符串排序
- Hadoop常用工具
- 获取SD卡中的图片资源并显示
- iOS内存管理
- Effective C++ 条款7——为多态基类声明virtual析构函数
- Android使用自定义AlertDialog(退出提示框)
- 常用与不常用端口3
- jsp学习笔记--内置对象
- 安卓实现在百度地图上播放历史轨迹
- java堆和栈小结
- Android SD卡中的复制
- VIM配置大全
- 一台机器多个tomcat运行的小注意小记录