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