基类中定了纯虚拟函数,派生类中将其实现,但在某些情况下会出现 r6025 runtime error, pure virtual function call 这样的错误。
在基类某个函数中调用该纯虚函数,本意是为了使用多态,
1. 在基类的构造函数中调用该函数,此时派生类派生类还未构造成功;
2.或是在基类的析构函数中调用该函数,此时派生类以被销毁;
以上两种情况均会导致该错误。
情况 1 代码示例: 在基类的构造函数中调用纯虚函数例子代码:
class BaseWithPureFunction { public: BaseWithPureFunction() { CallPureFunc(); // 此处调用了纯虚拟函数,该虚拟函数由派生类 //实现,但此处派生类还未构造成功,会导致r6025 //错误 } virtual void PureFunc() = 0; void CallPureFunc() { PureFunc(); } }; class BaseEx:public BaseWithPureFunction { public: virtual void PureFunc() { printf( "BaseEx::PureFunc()/r/n "); } };
情况 2 代码示例: 在基类的析构函数中调用纯虚函数
class BaseClassWithDestructorCallPureFun { public: virtual void PureFunc() = 0; void CallPureFunc() { PureFunc(); } virtual ~BaseClassWithDestructorCallPureFun() { std::cout<<"~BaseClassWithDestructorCallPureFun destructor call"<<endl ; CallPureFunc(); } private: }; class BaseEx2 : public BaseClassWithDestructorCallPureFun { public: virtual void PureFunc() { std::cout<<"PureFunc Call From BaseEx2" << endl; }; virtual ~BaseEx2 () { std::cout<<"~BaseEx2 destructor call"<<endl ; } private : }; void DestructorCallPureFun() { BaseEx2 ObjBaseEx; } int _tmain(int argc, _TCHAR* argv[]) { BaseEx BaseObj ; // 先调用父类构造函数, 在父类构造函数中我们调用了纯虚函数, 此时子类对象还没有 // 建立,导致调用纯虚函数错误!!! DestructorCallPureFun() ; // 在基类的析构函数调用了纯虚函数。函数退出时先析构派生类再析构父类,结果出错 }
可以调用下面函数处理 纯虚函数调用异常
_set_purecall_handler 可以替换系统处理函数,可以避免程序崩溃,暂时解决问题.
总结: 在父类的构造函数 和 析构函数 中都不能调用纯虚函数(不能以任何方式调用)。
【转自:http://blog.csdn.net/Blue_Dream_/article/details/2259649】