基類中定了純虛擬函數,派生類中將其實現,但在某些情況下會出現 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 可以替換系統處理函數,可以避免程序崩潰,暫時解決問題.
總結: 在父類的 構造函數 和 析構函數 中都不能調用純虛函數(不能以任何方式調用)。