Effective C++ 学习笔记(6)

来源:互联网 发布:如何用js判断是否闰年 编辑:程序博客网 时间:2024/06/02 17:29

Term 09: Never call virtual functions during construction or destruction.


不要在构造函数和析构函数内直接或间接调用虚函数,这时的虚函数不具备多态特性。存在一种场景,我们希望在基类的构造函数中针对不同的派生类实现有区别的构造。但如果在这里调用虚函数,那么派生类的对象在构造的时候先调用了这个基类的构造函数。由于派生类的构造函数并没有调用,因此调用派生类的方法存在着使用未初始化的派生类成员变量的危险。对于编译器而言,这种情况是不可接受的,因此选择在构造函数内将虚函数静态链接,不承认其动态特性。因此,在构造函数内调用的虚函数都不是真正的虚函数。

对于析构函数而言,有类似的情况。基类的析构函数调用时派生类的析构已经调用过,成员已销毁,因此调用的虚函数也不是真正的虚函数。

如果依然坚持想要在基类构造函数内针对不同的派生类对象执行不同的逻辑,可以由派生类构造函数传递不同的参数给基类的构造函数,从而基类可以根据不同的派生类构造函数执行不同的逻辑。如下:

<pre name="code" class="cpp">class CBase{    CBase(int nID);};CBase::CBase(int nID){    switch(nID)    {    case 1:        ...        break;    case 2:        ...        break;    default:        break;    }};class CDerived1: public CBase{    CDerived1():CBase(1);};class CDerived2: public CBase{    CDerived2():CBase(2);};


0 0
原创粉丝点击