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

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  可以替换系统处理函数,可以避免程序崩溃,暂时解决问题.

 总结: 在父类的 构造函数 和 析构函数 中都不能调用纯虚函数(不能以任何方式调用)。

你可能感兴趣的:(【转】纯虚函数调用 pure virtual function call 错误)