在父类的构造函数和析构函数中都不能调用纯虚函数
来源:互联网 发布:桌面会议软件 编辑:程序博客网 时间:2024/05/22 13:27
基类中定了纯虚拟函数,派生类中将其实现,但在某些情况下会出现 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】
- 在父类的构造函数和析构函数中都不能调用纯虚函数
- 在父类的构造函数和析构函数中都不能调用纯虚函数
- 父类的构造函数中不能调用纯虚函数,同样在析构函数中不能调用纯虚函数
- 构造函数/析构函数不能调用虚函数
- 类的构造函数、拷贝构造函数、赋值函数、析构函数,分别在何时调用。
- 在构造函数/析构函数中调用虚函数
- 在构造函数/析构函数中调用虚函数
- 类的析构函数和构造函数调用顺序
- 构造函数和析构函数在基类和派生类之间的调用顺序
- 非虚函数在基类和子类中都存在时,调用情况分析
- 虚函数在基类和子类中都存在时,调用情况分析
- 构造函数和析构函数中的虚函数调用
- 构造函数和析构函数中的虚函数调用
- 构造函数和析构函数内部调用虚函数
- C++不要在构造函数和析构函数中调用virtual函数的原因
- 随便写写看,关于析构和构造函数里面不能调用虚函数
- 《Effective C++》不要在构造函数和析构函数中调用虚函数
- 不要在构造函数和析构函数中调用虚函数
- c++面向对象编程必备“良方”
- 1.ring3-反调试-IsDebuggerPresent
- 有效用户ID、实际用户ID
- 使用SSIS创建同步数据库数据任务
- 加速Android UI(一):加速ListView
- 在父类的构造函数和析构函数中都不能调用纯虚函数
- Linux 内存管理
- mybatis中Date和DateTime字段的插入
- BOOST 线程完全攻略 - 基础篇
- regionprops Matlab function之opencv的cvBlobsLib
- CSDN博客积分规则
- 动态规划求解最长公共子序列问题
- firefox下jQuery UI Autocomplete 1.8.*中文输入修正
- 50种方法巧妙优化你的SQL Server数据库