《Effective C++》不要在构造函数和析构函数中调用虚函数

来源:互联网 发布:会锁机的软件下载 编辑:程序博客网 时间:2024/04/29 21:10
#include <iostream.h> class BASE { public: BASE() { myPrint(); } ~BASE() { myRelease(); } protected: virtual void myPrint(){cout<<"Base"<<endl;} virtual void myRelease(){cout<<"Base Release"<<endl;} }; class DERIVED:public BASE { protected: void myPrint(){cout<<"Derived"<<endl;} void myRelease(){cout<<"Derived Release"<<endl;} }; void main() { DERIVED d; }

运行:


可以看到,定义继承类对象的时候,基类构造函数和析构函数中调用的虚函数是并非是继承类的成员函数。

在构造期间,首先构造基类部分,此时继承类成员变量尚未初始化,如果允许调用子类虚函数,而子类成员函数很有可能要调用子类成员变量,为了避免使用未初始化的成员变量,C++拒绝在构造函数中调用子类重载的虚函数。

析构期间也是这样,子类先析构,此时子类成员变量再次呈现未初始化,所以析构函数中仍然拒绝调用子类重载的虚函数。


所以:在构造和析构期间不要调用虚函数。包括直接调用和间接调用。