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

來源:互聯網
上載者:User

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

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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.