c++ 之 純虛函數調用 pure virtual function call 錯誤

基類中定了純虛擬函數,派生類中將其實現,但在某些情況下會出現   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  可以替換系統處理函數,可以避免程序崩潰,暫時解決問題.

 總結: 在父類的 構造函數 和 析構函數 中都不能調用純虛函數(不能以任何方式調用)。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章