http://blog.csdn.net/blue_dream_/article/details/2259649?reload
基类中定了纯虚拟函数,派生类中将其实现,但在某些情况下会出现 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 可以替换系统处理函数,可以避免程序崩溃,暂时解决问题.
总结: 在父类的 构造函数 和 析构函数 中都不能调用纯虚函数(不能以任何方式调用)。