扯淡部分

坐公交上班常常遇到这种情形:人多,你只好站着。终于到某一公交站,你身边坐着的人起身下车,你正在犹豫要不要去抢座,这时,旁边的人指着这空位说,“你要坐吗?”,询问的人显得很有礼貌的样子。其实,你已经晚了,大多数情况下,得到的回答是“不坐”。

这是个很高明的询问!你看,问你之前,你靠位置更近,你处于优势地位。他要是直接坐过去,就给人感觉是在抢你的座位。然而,当他说出“你要坐吗”之后,你就瞬间成了劣势地位了。此话一出,就对外界表明了他想要坐这个座位了,公众会认为他比你先盯上这个座位,而且非常强烈地告诉你,你要是不坐的话,他马上就要坐了。此时如果你说你想坐,那么大家就会觉得你在抢他的座位了。再说他如此礼貌(至少表面听起来是很有礼貌的)地问你,你这时更合情理的做法是说自己不坐。这真是高明的询问,瞬间反客为主了。

如果你以后碰到类似情形,不妨这么试试。:)

虚析构函数

我写这篇文章的原因是我目前在学c++,有老师郑重地说道“写析构函数时一定加上virtual” (注:我已经毕业工作了,别以为我还在学校)。理由是你不清楚将来这个类会不会被继承。我听了当然是牢记在心,但是,我发现有很多代码的析构函数不是virtual的。我查找了些资料,想弄清楚什么时候析构函数该用virtual,于是乎就有了这篇文章。

一个例子

class Base{
public:
Base(){}
~Base(){cout << "base destructor" << endl;}
};class Derived :public Base{
public:
Derived(){}
~Derived(){cout << "derived destructor" << endl;}
};int main()
{
Base *b = new Derived();
delete b;
}

你惊讶地发现,只有基类的析构被调用了,这显然不是我们期待的。这时,如果你在基类的析构函数加上virtual,那就正常了。

难道每个类都不分青红皂白地加上virtual吗?不应该这么做。virtual函数会增加虚函数表的开销。这个类如果不设计为基类,何必加上virtual呢。

何时使用

我们很想知道那些情况下的析构函数是vitrual的,很多人都会说是多态,如果你打算使用多态,意味着有virtual函数,我翻开《effective c++》,上面赫然写着

“如果一个class带有任何virtual函数,他就应该拥有一个vitual析构函数”

好了,使用多态时记得把析构函数声明为vitual。那我要问了,我不使用多态,析构函数就不必要是vitual的吗?

再看看这种情况,比如要延迟删除某些对象,我们可能会把这些派生类以父类指针的形式存放在容器中,然后在某个时刻集体delete。要知道,继承不一定要用多态,继承可以提高代码复用。然而这里的基类的析构函数显然要声明为vitual。

不过,我倒是觉得,上面这种情况可以说就是是多态,析构函数不就是特殊点的函数嘛,肯定也是晚绑定。因此,到目前为止,我认为如果没有任何多态使用,那么这个类的析构函数就没必要是vitual的

vitual本质

现在,把析构函数推广到普通函数,当你的父类型的指针指向一个子类的对象:

pBase = pDrived;

pBase所调用的某函数希望是Drived的,那么该函数就应该声明为virtual的。

转载请注明出处:http://blog.csdn.net/booirror/article/details/16918705

挤公交闲谈与虚析构函数精讲相关推荐

  1. C++中基类的析构函数为什么要用virtual虚析构函数

    知识背景 要弄明白这个问题,首先要了解下C++中的动态绑定. 关于动态绑定的讲解,请参阅:  C++中的动态类型与动态绑定.虚函数.多态实现 正题 直接的讲,C++中基类采用virtual虚析构函数是 ...

  2. 【原创】分布式之redis复习精讲

    引言 为什么写这篇文章? 博主的<分布式之消息队列复习精讲>得到了大家的好评,内心诚惶诚恐,想着再出一篇关于复习精讲的文章.但是还是要说明一下,复习精讲的文章偏面试准备,真正在开发过程中, ...

  3. 虚析构函数? vptr? 指针偏移?多态数组? delete 基类指针 内存泄漏?崩溃?...

    五条基本规则: 1.如果基类已经插入了vptr, 则派生类将继承和重用该vptr.vptr(一般在对象内存模型的顶部)必须随着对象类型的变化而不断地改变它的指向,以保证其值和当前对象的实际类型是一致的 ...

  4. 分布式之redis复习精讲

    转载自  分布式之redis复习精讲 引言 为什么写这篇文章? 博主的<分布式之消息队列复习精讲>得到了大家的好评,内心诚惶诚恐,想着再出一篇关于复习精讲的文章.但是还是要说明一下,复习精 ...

  5. vs 不能自动 析构函数_深入理解C++虚函数的override、overload与hide以及虚析构函数...

    今天主要讲的是虚函数的override与overload的区别.首先我们来看一段代码: 示例代码 #include <stdio.h> #include <string> #i ...

  6. 【转载】分布式之redis复习精讲

    注: 本篇文章转自:分布式之redis复习精讲 引言 为什么写这篇文章? 博主的<分布式之消息队列复习精讲>得到了大家的好评,内心诚惶诚恐,想着再出一篇关于复习精讲的文章.但是还是要说明一 ...

  7. C++ 基类和派生类的virtual虚析构函数

    virtual虚函数与C++的多态息息相关,C++中基类采用virtual虚析构函数主要目的是为了防止潜在的内存泄漏. 具体地说,如果派生类中申请了内存空间,并在其析构函数中对这些内存空间进行释放.假 ...

  8. 【信息资源管理】单选多选,精讲

    [信息资源管理]单选多选,精讲 J1 J2 J3 J4 随堂考 作业 J5 随堂考 J6 随堂考 作业 J7 J8 J9 J1 1.支配人类社会发展的三大基本要素是(D)A. 资源.人力.资本 B. ...

  9. React实战精讲(React_TS/API)

    英国诗人 萨松在诗歌 <与我,过去.现在以及未来>中写道:"In me the tiger sniffs the rose" 诗人余光中将其翻译为:"心有猛虎 ...

最新文章

  1. fzu 1686(DLX 重复点覆盖)
  2. C语言中printf是不是关键字,C语言中printf是什么意思
  3. ALV 后台输出时,增加spool假脱机的宽度
  4. CUDA Stream流并发性
  5. 振作起来– Spring Framework 4.0即将来临!
  6. 屏幕实战效果解析:IPS/TFT/AMOLED/SLCD
  7. MySQL常用数据类型以及内置函数
  8. linux mysql插入中文乱码_Unix下Mysql插入中文出现乱码
  9. 语音分享应用ios源码项目
  10. 分享一下我的面试和入职经历
  11. 中国行政区划代码,包括五级行政区划详细代码,县级以上区划地理围栏
  12. 崔荣容,英语如法入门1-50讲
  13. 网络爬虫是什么意思?
  14. 爱奇艺影视剧智能配音系统奇声获2022年度CCF科技成果奖“科技进步一等奖”
  15. linux c语言 修改mac地址,C语言根据MAC地址查找网卡并修改IP地址
  16. 设计模式-业务代表模式-个人思考
  17. java生成随机密码,包含大小写字母,数字,特殊字符等
  18. 软件构造课程面向对象编程学习心得
  19. 3.线程安全之可见性、有序性、原子性是什么?
  20. 计算机找不到网络设备,解决在设备管理器中找不到网卡的问题

热门文章

  1. 访问ftp服务器文件夹,访问ftp服务器文件夹
  2. 机器视觉VisionBank智能视觉软件全面解读
  3. 牛客.哈尔滨工程大学第十四届程序设计竞赛 (F.I.L)
  4. Linux之grep 命令
  5. expdp和impdp用法,备份oracle库
  6. 计算机网络自考真题,自考计算机网络历年真题及答案汇编.pdf
  7. 【ElM分类】基于哈里斯鹰优化ElM神经网络实现数据分类附matlab代码
  8. 应用在物联网中的LPWAN有哪些优势
  9. Python中单引号和双引号的区别
  10. Java16位订单号,Java通过UUID生成16位唯一订单号