【读书笔记】Effective C++-2 构造/析构/赋值运算(之三)
来源:互联网 发布:淘宝全球综合排名 编辑:程序博客网 时间:2024/04/28 06:00
Effective C++读书笔记
--By Nathan.Yu 2007-11-15--
2 构造/析构/赋值运算(之三)
条款07:为多态基类声明virtual析构函数
问题:何时该声明virtual析构函数,何时不该这样做?
【要点摘录】C++明确指出,当derived class对象经由一个base class指针被删除,而该base class带着一个non-virtual析构函数,其结果未有定义——实际执行时常发生的是对象的derived成分没被销毁。造成“局部销毁”对象。消除这个问题的做法很简单:
给base class一个virtual析构函数。
任何class只要带有virtual函数都几乎确定应该也有一个virtual析构函数。
如果class不含virtual函数,通常表示它并不意图被用做一个base class。当class不企图当作base class,令其析构函数为virtual往往是个馊主意。
无端的将classes对析构函数声明为virtual,就像从未声明它们为virtual一样,都是错误的。许多人都心得是:
只有当class内至少含一个virtual函数,才为他声明virtual函数。
如果你曾经企图继承(作为多态继承,一般是public继承)一个标准容器或任何其他“带有non-virtual析构函数”的class,拒绝诱惑吧!(很不幸,C++没有提供类似Java的final classes或C#的sealed class那样的“禁止派生”机制)。
当你需要一个抽象类,但没有任何可用的pure virtual时(可能是其他的virtual函数都有默认实现),可以声明一个pure virtual析构函数。因为,抽象类总是企图被当作一个base class来用,做为base class就必须有个virtual析构函数,而pure virtual导致抽象类,因此可以声明一个pure virtual析构函数,使其成为抽象类。但必须为这个pure virtual析构函数提供一份定义,否则会发生链接错误。因为在销毁派生对象时,最终会调用这个抽象类的析构函数。
“给base classes一个virtual析构函数”,这个规则只适用于带多态性质的base classes身上。这种base classes的设计目的是为了用来“通过base class接口处理derived class对象”。
并非所有的base class的设计目的都是为了多态用途的。某些类的设计目的是仅仅作为基类实现代码复用,但不是为了多态用途(它们没有任何virtual函数),由于它们不被设计用来“经由base class接口处置derived class对象”,因此它们不需要virtual析构函数。
请记住:
1、 polymorphic(带多态性质的)base classes 应该声明一个virtual析构函数。如果class带有任何virtual函数,它就应该拥有一个virtual析构函数。
2、 Classes的设计目的如果不是作为base classes使用,或不是为了具备多态(polymorphically),就不该声明virtual析构函数。
- 【读书笔记】Effective C++-2 构造/析构/赋值运算(之三)
- 【读书笔记】Effective C++-2 构造/析构/赋值运算(之二)
- 【读书笔记】Effective C++-2 构造/析构/赋值运算(之四)
- 【读书笔记】Effective C++-2 构造/析构/赋值运算(之一)
- 《Effective C++》读书笔记(三) 构造/析构/赋值运算 (第二部分)
- Effective C++读书笔记之构造/析构/赋值运算
- Effective C++读书笔记---构造/析构/赋值运算
- Effective C++读书笔记2(构造/析构/赋值运算)
- 《Effective C++》第2章 构造/析构/赋值运算(1)-读书笔记
- 【读书笔记】构造、析构、赋值(Effective C++)
- Effective C++(二)构造/析构/赋值运算
- effective c++-构造/析构/赋值运算
- 《Effective C++》构造、析构、赋值运算
- <<Effective C++>>读书笔记2: 构造/析构/赋值函数
- effective c++之构造 析构 赋值运算
- effective C++之构造、析构、赋值运算
- Effective C++之构造、析构、赋值运算
- Effective C++之2 构造/析构/赋值运算
- 超级详细易懂的Struts+Spring+Hibernate实现上传下载
- How to use HttpWebRequest and RegularExpressions to crash website
- 质量之本在哪里
- Visual C# 生成DLL文件
- 关于一道1到N自然数排序的华为面试题
- 【读书笔记】Effective C++-2 构造/析构/赋值运算(之三)
- ndx subfile "nroff -mm -rw70 file" > indexfile
- SOA有两大目标
- html之Form
- 旱半夏种植技术
- 陇西中药材产业报高
- 甘肃省中药材发展规划2003~2007年
- 旱半夏的高产栽培要点
- 以颤抖之身追赶 怀敬畏之心挑战