在父类的构造函数和析构函数中都不能调用纯虚函数

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

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

【转自:http://blog.csdn.net/Blue_Dream_/article/details/2259649】

 

 

 

你可能感兴趣的:(在父类的构造函数和析构函数中都不能调用纯虚函数)