effective c++(07)之为多态基类声明virtual析构函数
class TimeKeeper { public: TimeKeeper() ; ~TimeKepper() ; ... } ; class AtomicClock:public TimeKeeper{...}// 原子钟 class WaterClock:public TimeKeeper{...}// 水钟 class WristWatch:public TimeKeeper{...}// 腕表
根据工厂模式,会返回一个base class指针指向新生成的derived class对象。
TimeKeeper* getTimeKeeper() ;// 返回一个指针,指向一个TimeKeeper派生类的动态分配对象
如果delete掉(如果不delete则有可能会造成内存或者其他资源泄露)返回的指针。如下:
TimeKeeper* ptk = getTimeKeeper();// 从TimeKeeper继承体系获得一个动态内存分配对象。 ... delete ptk ;// 释放它,避免资源泄露。
此时如果基类有non-virtual析构函数,此时调用delete之后只销毁了base class,而derived class没有被销毁。解决方法是将base class的析构函数定义成virtual函数。此时会造成资源泄露,败坏数据结构,在调试器上浪费时间等现象。
如果class中不含有virtual函数说明他不想做为一个基类。
如果试图继承一个标准容器或者任何其他"non-virtual"析构函数的class,拒绝诱惑吧。。。
对于pure virtual函数如下:
class AWOV // AWOV = "Abstract w/o Virtuals" { public: virtual ~AWOV() = 0 ;// 声明pure virtual析构函数 } ;
此时不必担心析构函数的问题,但必须要为~AWOV()函数提供一个定义,因为编译器会在AWOV的derived class中创建一个调用该函数的动作。
结论:
1. ploymorphic(多态) base classes应声明一个virtual析构函数。如果class带有任何virtual函数,他们就应该有一个virtual析构函数。
2. class的设计目的如果不是作为base class 使用,或者不是为了具备多态性,就不能声明为virtual析构函数。