【读书笔记】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 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析构函数。

 
原创粉丝点击