挤公交闲谈与虚析构函数精讲

扯淡部分

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

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

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

虚析构函数

我写这篇文章的原因是我目前在学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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值