挤公交闲谈与虚析构函数精讲
扯淡部分
坐公交上班常常遇到这种情形:人多,你只好站着。终于到某一公交站,你身边坐着的人起身下车,你正在犹豫要不要去抢座,这时,旁边的人指着这空位说,“你要坐吗?”,询问的人显得很有礼貌的样子。其实,你已经晚了,大多数情况下,得到的回答是“不坐”。
这是个很高明的询问!你看,问你之前,你靠位置更近,你处于优势地位。他要是直接坐过去,就给人感觉是在抢你的座位。然而,当他说出“你要坐吗”之后,你就瞬间成了劣势地位了。此话一出,就对外界表明了他想要坐这个座位了,公众会认为他比你先盯上这个座位,而且非常强烈地告诉你,你要是不坐的话,他马上就要坐了。此时如果你说你想坐,那么大家就会觉得你在抢他的座位了。再说他如此礼貌(至少表面听起来是很有礼貌的)地问你,你这时更合情理的做法是说自己不坐。这真是高明的询问,瞬间反客为主了。
如果你以后碰到类似情形,不妨这么试试。:)
虚析构函数
我写这篇文章的原因是我目前在学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
挤公交闲谈与虚析构函数精讲相关推荐
- C++中基类的析构函数为什么要用virtual虚析构函数
知识背景 要弄明白这个问题,首先要了解下C++中的动态绑定. 关于动态绑定的讲解,请参阅: C++中的动态类型与动态绑定.虚函数.多态实现 正题 直接的讲,C++中基类采用virtual虚析构函数是 ...
- 【原创】分布式之redis复习精讲
引言 为什么写这篇文章? 博主的<分布式之消息队列复习精讲>得到了大家的好评,内心诚惶诚恐,想着再出一篇关于复习精讲的文章.但是还是要说明一下,复习精讲的文章偏面试准备,真正在开发过程中, ...
- 虚析构函数? vptr? 指针偏移?多态数组? delete 基类指针 内存泄漏?崩溃?...
五条基本规则: 1.如果基类已经插入了vptr, 则派生类将继承和重用该vptr.vptr(一般在对象内存模型的顶部)必须随着对象类型的变化而不断地改变它的指向,以保证其值和当前对象的实际类型是一致的 ...
- 分布式之redis复习精讲
转载自 分布式之redis复习精讲 引言 为什么写这篇文章? 博主的<分布式之消息队列复习精讲>得到了大家的好评,内心诚惶诚恐,想着再出一篇关于复习精讲的文章.但是还是要说明一下,复习精 ...
- vs 不能自动 析构函数_深入理解C++虚函数的override、overload与hide以及虚析构函数...
今天主要讲的是虚函数的override与overload的区别.首先我们来看一段代码: 示例代码 #include <stdio.h> #include <string> #i ...
- 【转载】分布式之redis复习精讲
注: 本篇文章转自:分布式之redis复习精讲 引言 为什么写这篇文章? 博主的<分布式之消息队列复习精讲>得到了大家的好评,内心诚惶诚恐,想着再出一篇关于复习精讲的文章.但是还是要说明一 ...
- C++ 基类和派生类的virtual虚析构函数
virtual虚函数与C++的多态息息相关,C++中基类采用virtual虚析构函数主要目的是为了防止潜在的内存泄漏. 具体地说,如果派生类中申请了内存空间,并在其析构函数中对这些内存空间进行释放.假 ...
- 【信息资源管理】单选多选,精讲
[信息资源管理]单选多选,精讲 J1 J2 J3 J4 随堂考 作业 J5 随堂考 J6 随堂考 作业 J7 J8 J9 J1 1.支配人类社会发展的三大基本要素是(D)A. 资源.人力.资本 B. ...
- React实战精讲(React_TS/API)
英国诗人 萨松在诗歌 <与我,过去.现在以及未来>中写道:"In me the tiger sniffs the rose" 诗人余光中将其翻译为:"心有猛虎 ...
最新文章
- fzu 1686(DLX 重复点覆盖)
- C语言中printf是不是关键字,C语言中printf是什么意思
- ALV 后台输出时,增加spool假脱机的宽度
- CUDA Stream流并发性
- 振作起来– Spring Framework 4.0即将来临!
- 屏幕实战效果解析:IPS/TFT/AMOLED/SLCD
- MySQL常用数据类型以及内置函数
- linux mysql插入中文乱码_Unix下Mysql插入中文出现乱码
- 语音分享应用ios源码项目
- 分享一下我的面试和入职经历
- 中国行政区划代码,包括五级行政区划详细代码,县级以上区划地理围栏
- 崔荣容,英语如法入门1-50讲
- 网络爬虫是什么意思?
- 爱奇艺影视剧智能配音系统奇声获2022年度CCF科技成果奖“科技进步一等奖”
- linux c语言 修改mac地址,C语言根据MAC地址查找网卡并修改IP地址
- 设计模式-业务代表模式-个人思考
- java生成随机密码,包含大小写字母,数字,特殊字符等
- 软件构造课程面向对象编程学习心得
- 3.线程安全之可见性、有序性、原子性是什么?
- 计算机找不到网络设备,解决在设备管理器中找不到网卡的问题
热门文章
- 访问ftp服务器文件夹,访问ftp服务器文件夹
- 机器视觉VisionBank智能视觉软件全面解读
- 牛客.哈尔滨工程大学第十四届程序设计竞赛 (F.I.L)
- Linux之grep 命令
- expdp和impdp用法,备份oracle库
- 计算机网络自考真题,自考计算机网络历年真题及答案汇编.pdf
- 【ElM分类】基于哈里斯鹰优化ElM神经网络实现数据分类附matlab代码
- 应用在物联网中的LPWAN有哪些优势
- Python中单引号和双引号的区别
- Java16位订单号,Java通过UUID生成16位唯一订单号