扯淡部分
坐公交上班常常遇到这种情形:人多,你只好站着。终于到某一公交站,你身边坐着的人起身下车,你正在犹豫要不要去抢座,这时,旁边的人指着这空位说,“你要坐吗?”,询问的人显得很有礼貌的样子。其实,你已经晚了,大多数情况下,得到的回答是“不坐”。
这是个很高明的询问!你看,问你之前,你靠位置更近,你处于优势地位。他要是直接坐过去,就给人感觉是在抢你的座位。然而,当他说出“你要坐吗”之后,你就瞬间成了劣势地位了。此话一出,就对外界表明了他想要坐这个座位了,公众会认为他比你先盯上这个座位,而且非常强烈地告诉你,你要是不坐的话,他马上就要坐了。此时如果你说你想坐,那么大家就会觉得你在抢他的座位了。再说他如此礼貌(至少表面听起来是很有礼貌的)地问你,你这时更合情理的做法是说自己不坐。这真是高明的询问,瞬间反客为主了。
如果你以后碰到类似情形,不妨这么试试。:)
虚析构函数
我写这篇文章的原因是我目前在学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