【转】纯虚函数调用 pure virtual function call 错误
2013-05-27 11:51
567 查看
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 可以替换系统处理函数,可以避免程序崩溃,暂时解决问题.
总结: 在父类的 构造函数 和 析构函数 中都不能调用纯虚函数(不能以任何方式调用)。
基类中定了纯虚拟函数,派生类中将其实现,但在某些情况下会出现 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 可以替换系统处理函数,可以避免程序崩溃,暂时解决问题.
总结: 在父类的 构造函数 和 析构函数 中都不能调用纯虚函数(不能以任何方式调用)。
相关文章推荐
- 纯虚函数调用 pure virtual function call 错误
- "Pure Virtual Function Called" 纯虚函数调用错误分析(翻译)
- pure virtual function call--虚函数调用的错误
- eclipse 中 r6025 pure virtual function call 错误的解决方法
- mindmanager的R6025 - pure virtual function call错误解决办法
- 一篇非常不错的探讨pure virtual function call错误的文章。
- eclipse 中 r6025 pure virtual function call 错误的解决方法[转]
- pure virtual function called--虚函数调用错误
- 一篇关于pure virtual function call错误的文章.
- Box2d CreateFixture 发生错误 Debug Error:R6025 pure virtual function call 解决办法
- mindmanager的R6025 - pure virtual function call错误解决办法
- image 的Css中的behavior属性导致 pure virtual function call 错误
- pure virtual function called--虚函数调用错误
- 运行opencv程序后出现runtime error! R6025-pure virtual function call 错误提示的解决方法
- Mindjet MindManager 2012 从模板创建出现“Runtime Error pure virtual function call” 解决方法
- 不要在基类析构函数中调用纯虚函数,否则运行时会报错“pure virtual method called”
- First chance exception & R6025-pure virtual function call的问题 Opencv
- 【转载】一篇详尽分析C++“Pure Virtual Function Called”错误的文章
- First chance exception & R6025-pure virtual function call的问题 Opencv
- Pure virtual function call error探讨