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函数。此时会形成资源泄露,败坏数据结构,在调试器上浪费时间等现象。spa
若是class中不含有virtual函数说明他不想作为一个基类。设计
若是试图继承一个标准容器或者任何其余"non-virtual"析构函数的class,拒绝诱惑吧。。。指针
对于pure virtual函数以下:调试
class AWOV // AWOV = "Abstract w/o Virtuals" { public: virtual ~AWOV() = 0 ;// 声明pure virtual析构函数 } ;
此时没必要担忧析构函数的问题,但必需要为~AWOV()函数提供一个定义,由于编译器会在AWOV的derived class中建立一个调用该函数的动做。code
结论:对象
1. ploymorphic(多态) base classes应声明一个virtual析构函数。若是class带有任何virtual函数,他们就应该有一个virtual析构函数。blog
2. class的设计目的若是不是做为base class 使用,或者不是为了具有多态性,就不能声明为virtual析构函数。继承