【读书笔记】Effective C++-2 构造/析构/赋值运算(之三)
2007-11-16 01:22
281 查看
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章 构造/析构/赋值运算(1)-读书笔记
- 【读书笔记】Effective C++-2 构造/析构/赋值运算(之一)
- 【读书笔记】Effective C++-2 构造/析构/赋值运算(之四)
- 《Effective C++》第2章 构造/析构/赋值运算(2)-读书笔记
- 《Effective C++》 读书笔记之二 构造/析构/赋值运算
- 《Effective C++》读书笔记(三) 构造/析构/赋值运算 (第二部分)
- 《Effective C++》读书笔记(二) 构造/析构/赋值运算 (第一部分)
- 《Effective C++》第2章 构造/析构/赋值运算(1)-读书笔记
- 【读书笔记】Effective C++-2 构造/析构/赋值运算(之二)
- effective c++-构造/析构/赋值运算
- Effective C++ — 构造/析构/赋值运算(一)
- [Effective C++]构造/析构/赋值运算
- Effective C++(二)构造/析构/赋值运算
- Effective C++之2 构造/析构/赋值运算
- 《Effective C++第三版》读书笔记——构造/析构/赋值运算
- 【effective c++】构造/析构/赋值运算
- 《Effective C++第三版》读书笔记——构造/析构/赋值运算
- Effective C++ 笔记二 构造/析构/赋值运算
- Effective C++ 笔记 第二部分 构造/析构/赋值运算
- Effective C++ —— 构造/析构/赋值运算(二)