您的位置:首页 > 其它

【转】纯虚函数调用 pure virtual function call 错误

2013-05-27 11:51 567 查看
http://blog.csdn.net/blue_dream_/article/details/2259649?reload

基类中定了纯虚拟函数,派生类中将其实现,但在某些情况下会出现   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  可以替换系统处理函数,可以避免程序崩溃,暂时解决问题.

 总结: 在父类的 构造函数 和 析构函数 中都不能调用纯虚函数(不能以任何方式调用)。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: