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() = ;// 声明pure virtual析构函数
} ;
此时不必担心析构函数的问题,但必须要为~AWOV()函数提供一个定义,因为编译器会在AWOV的derived class中创建一个调用该函数的动作。
结论:
1. ploymorphic(多态) base classes应声明一个virtual析构函数。如果class带有任何virtual函数,他们就应该有一个virtual析构函数。
2. class的设计目的如果不是作为base class 使用,或者不是为了具备多态性,就不能声明为virtual析构函数。
effective c++(07)之为多态基类声明virtual析构函数的更多相关文章
- Effective C++ -----条款07:为多态基类声明virtual析构函数
polymorphic(带多态性质的)base classes应该声明一个virtual析构函数.如果class带有任何virtual函数,它就应该拥有一个virtual析构函数. Classes的设 ...
- Effective C++学习笔记 条款07:为多态基类声明virtual析构函数
一.C++明确指出:当derived class对象经由一个base class指针被删除,而该base class带着一个non-virtual析构函数,其结果未定义——实际执行时通常发生的是对象的 ...
- Effective C++ 条款七 为多态基类声明virtual析构函数
class TimeKeeper { public: TimeKeeper(); // ~TimeKeeper(); 错误,此作为一个基类,被继承了.其继承类被delete后,基类被销毁,但继承类可能 ...
- [Effective C++系列]-为多态基类声明Virtual析构函数
Declare destructors virtual in polymorphic base classes. [原理] C++指出,当derived class对象经由一个由base clas ...
- 为多态基类声明virtual析构函数
一个函数的返回值为基类指针,而当指针指向一个派生类对象,接下来派生类对象被这个基类指针删除的时候,就出现了局部销毁的问题.因为C++指出,当派生类经由一个基类指针被删除,而该基类指针带着一个non-v ...
- [Effective C++ --007]为多态基类声明virtual析构函数
引言: 我们都知道类的一个很明显的特性是多态,比如我们声明一个水果的基类: class Fruit { public: Fruit() {}; ~Fruit(){}; } 那么我们根据这个Fruit基 ...
- Effective C++_笔记_条款07_为多态基类声明virtual析构函数
(整理自Effctive C++,转载请注明.整理者:华科小涛@http://www.cnblogs.com/hust-ghtao/) 这个规则只适用于polymorphic(带多态性质的)base ...
- Effective C++(7) 为多态基类声明virtual析构函数 or Not
问题聚焦: 已经对一个对象执行了delete语句,还会发生内存泄漏吗? 先来看个demo: // 计时器类 class TimeKeeper { public: TimeKeeper(); ~Time ...
- 【C++】为多态基类声明virtual析构函数
来自<Effective C++>条款07:为多态声明virtual析构函数 当derived class对象经由一个base class指针被删除,而该base class带着一个non ...
随机推荐
- 74LS164 for stm32 源码下载
在单片机系统中, 如果并行口的IO资源不够,而串行口又没有其他的作用, 那么我们可以用74LS164来扩展并行IO口,节约单片机资源. 74LS164是一个串行输入并行输出的移位寄存器 ...
- passport.js
$(function(){ function isPlaceholder(){ var input = document.createElement('input'); return 'placeho ...
- iOS 沙盒目录结构介绍
iOS系统中,每个应用都有自己的沙盒,且应用只能访问其对应的沙盒目录下面的文件.当然,在用户授权的情况下,应用也可以访问其他目录下面的文件.比如,用户授权情况下,应用可以访问相册.通讯录.在开发中,经 ...
- 用MyGeneration模板生成NHibernate映射文件和关系
用我的MyGeneration模板生成NHibernate映射文件和关系(one-to-one,one-to-many,many-to-many) MyGeneration的几个NHibernate模 ...
- ECSHOP在线手册布局参考图--通用活动页 group_list.dwt等
A.购物车 1,设置方法 程序自动读取购物车的商品数量 2,代码相关 cart.lbi 中 {insert_scripts files='transport.js'} <div clas ...
- 删除浏览器浏览器删除cookie方法
上班之余抽点时光出来写写博文,希望对新接触的朋友有帮助.今天在这里和大家一起学习一下删除浏览器 文章目录导航 适用范围及演示工具 什么是cookie? cookie有什么作用? ie6/ie7/ie8 ...
- php递归无限极分类
递归无限级分类有几种形式,我这里仅仅举例比較经常使用的三种: 第一种:返回有排序的数组: <?php $data = array( 1 => array( 'id' => 1, 'p ...
- 学习笔记之Shell脚本学习指南 & sed与awk & 正则表达式
正则表达式_百度百科 http://baike.baidu.com/link?url=ybgDrN2WQQKN64_gu-diCqdeDqL8LQ-jiQ-ftzzPaNUa9CmgBRDNnyx50 ...
- 启动和启动和停止MySQL服务停止MySQL服务
1. 启动MySQL服务 启动MySQL服务的命令为: /etc/init.d/mysqld start 命令执行后如图7-5所示,表示启动MySQL服务成功. (点击查看大图)图7-5 启动 ...
- unicode 编码总结
unicode简介: unicode又称为unicode character set,缩写为ucs,意为字符集.编码方式有utf-7,utf-8,utf-16,utf-32几种,常用的是utf-8和u ...