`
nathan09
  • 浏览: 145617 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

【读书笔记】Effective C++-2 构造/析构/赋值运算(之三)

 
阅读更多

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 classclass不企图当作base class,令其析构函数为virtual往往是个馊主意。

无端的将classes对析构函数声明为virtual,就像从未声明它们为virtual一样,都是错误的。许多人都心得是:

只有当class内至少含一个virtual函数,才为他声明virtual函数。

如果你曾经企图继承(作为多态继承,一般是public继承)一个标准容器或任何其他“带有non-virtual析构函数”的class,拒绝诱惑吧!(很不幸,C++没有提供类似Javafinal classesC#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析构函数。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics