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() = ;// 声明pure virtual析构函数
} ;

此时不必担心析构函数的问题,但必须要为~AWOV()函数提供一个定义,因为编译器会在AWOV的derived class中创建一个调用该函数的动作。

结论:

1. ploymorphic(多态) base classes应声明一个virtual析构函数。如果class带有任何virtual函数,他们就应该有一个virtual析构函数。

2. class的设计目的如果不是作为base class 使用,或者不是为了具备多态性,就不能声明为virtual析构函数。

effective c++(07)之为多态基类声明virtual析构函数的更多相关文章

  1. Effective C++ -----条款07:为多态基类声明virtual析构函数

    polymorphic(带多态性质的)base classes应该声明一个virtual析构函数.如果class带有任何virtual函数,它就应该拥有一个virtual析构函数. Classes的设 ...

  2. Effective C++学习笔记 条款07:为多态基类声明virtual析构函数

    一.C++明确指出:当derived class对象经由一个base class指针被删除,而该base class带着一个non-virtual析构函数,其结果未定义——实际执行时通常发生的是对象的 ...

  3. Effective C++ 条款七 为多态基类声明virtual析构函数

    class TimeKeeper { public: TimeKeeper(); // ~TimeKeeper(); 错误,此作为一个基类,被继承了.其继承类被delete后,基类被销毁,但继承类可能 ...

  4. [Effective C++系列]-为多态基类声明Virtual析构函数

    Declare destructors virtual in polymorphic base classes.   [原理] C++指出,当derived class对象经由一个由base clas ...

  5. 为多态基类声明virtual析构函数

    一个函数的返回值为基类指针,而当指针指向一个派生类对象,接下来派生类对象被这个基类指针删除的时候,就出现了局部销毁的问题.因为C++指出,当派生类经由一个基类指针被删除,而该基类指针带着一个non-v ...

  6. [Effective C++ --007]为多态基类声明virtual析构函数

    引言: 我们都知道类的一个很明显的特性是多态,比如我们声明一个水果的基类: class Fruit { public: Fruit() {}; ~Fruit(){}; } 那么我们根据这个Fruit基 ...

  7. Effective C++_笔记_条款07_为多态基类声明virtual析构函数

    (整理自Effctive C++,转载请注明.整理者:华科小涛@http://www.cnblogs.com/hust-ghtao/) 这个规则只适用于polymorphic(带多态性质的)base ...

  8. Effective C++(7) 为多态基类声明virtual析构函数 or Not

    问题聚焦: 已经对一个对象执行了delete语句,还会发生内存泄漏吗? 先来看个demo: // 计时器类 class TimeKeeper { public: TimeKeeper(); ~Time ...

  9. 【C++】为多态基类声明virtual析构函数

    来自<Effective C++>条款07:为多态声明virtual析构函数 当derived class对象经由一个base class指针被删除,而该base class带着一个non ...

随机推荐

  1. 教程-经典Delphi教程网

    有理想+志同道合的人+取长补短去协同工作=完美团队一流的项目 + 三流的执行者 = 垃圾项目三流的项目 + 一流的执行者 = 完美项目 自己公司网址:http://www.kaideruixin.ic ...

  2. PCB编辑快捷键

    TAB: 调节属性PgUp: 放大PgDn: 缩小Delete: 删除Ctrl+C: 复制Ctrl+V: 粘贴Ctrl+X: 剪贴Ctrl+Z: 撤销Ctrl+Y: 取消撤销Ctrl+F: 查找Ctr ...

  3. hdu 5585 Numbers【大数+同余定理】

    Numbers Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Sub ...

  4. light oj 1214 - Large Division

    1214 - Large Division   PDF (English) Statistics Forum Time Limit: 1 second(s) Memory Limit: 32 MB G ...

  5. 射频识别技术漫谈(9)——动物标签HDX【worldsing笔记】

    半双工(HDX,Half Duplex)技术是ISO11784/11785中规定的另一种标签与读写器之间的通讯方式.读写器先打开射频场对标签充电以激活标签,然后关闭磁场,标签在读写器磁场关闭的情况下向 ...

  6. Java数组的内存管理

    Java数组的内存管理 Java语言是典型的静态语言,因此Java的数组是静态的,即当数组被初始化之后,该数组的长度是不可变的.Java程序中的数组必须经初始化才能使用.所谓初始化,就是当数组对象的元 ...

  7. hdu2545 树上战争 (并查集)

    Problem Description 给一棵树,如果树上的某个节点被某个人占据,则它的所有儿子都被占据,lxh和pfz初始时分别站在两个节点上,谁当前所在的点被另一个人占据,他就输了比赛,问谁能获胜 ...

  8. 关于PKCS5Padding与PKCS7Padding的区别

    国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html内部邀请码:C8E245J (不写邀请码,没有现金送)国内私 ...

  9. cocos2d-x 聊天输入框实现

    转自:http://bbs.9ria.com/thread-216948-1-10.html 聊天输入框  (单行输入框 ,多行可自己扩展) 实现功能: 1.普通输入 2.设置输入框显示最大宽度(PT ...

  10. JS 数据类型转换-转换函数、强制类型转换、利用js变量弱类型转换

    1. 转换函数: js提供了parseInt()和parseFloat()两个转换函数.前者把值转换成整数,后者把值转换成浮点数.只有对String类型调用这些方法,这两个函数才能正确运行:对其他类型 ...