构造函数中不应调用虚函数

mac2022-06-30  22

   今天调试程序,遇到一个很费解的问题,现在做个记录:

   class CS3Adapter : public CBaseAdapter

   类CS3Adapter继承于CBaseAdapter,其中

CBaseAdapter::CBaseAdapter(void){ DWORD ThreadID = 0; HANDLE hThread = 0; hThread = StartControlThread(&ThreadID); if (hThread) {  m_hControlThread = hThread;  m_ControlThreadID = ThreadID; } }

CBaseAdapter::~CBaseAdapter(void){ StopControlThread(m_hControlThread,m_ControlThreadID);}

DWORD ControlThread(LPVOID pData) { CBaseAdapter *p=(CBaseAdapter*)pData; if (p) {  p->on_control_thread(); }

 return 0;}HANDLE CBaseAdapter::StartControlThread( DWORD *pThreadID ){ BOOL fRet = FALSE; HANDLE hThread = NULL; DWORD ThreadID = 0; 

 hThread=::CreateThread(NULL,0,ControlThread, this,0, &ThreadID ); if ( NULL!=hThread ){  if ( pThreadID ) *pThreadID = ThreadID; } return hThread;}

void CBaseAdapter::on_control_thread(){

}

其中CBaseAdapter::on_control_thread()是虚函数,在CS3Adapter中有定义void CS3Adapter::on_control_thread(),现在的情况是,new CS3Adapter,程序进入不了CS3Adapter::on_control_thread()(这个程序运行在WINCE设备上,在某些机子或模拟器上可以进入,但在我的调试机上不能进),经过追踪,发现可能是由于在构造函数中启动线程,会由于对象还没完全构造完毕(估计原因,真正是不是还待再确认),从而p->on_control_thread()得不到正确的地址。将构造函数中的语句另外放到一个共用函数中,new对象后再调用,就可以解决问题。

 

后记:后来再看到一本书,明确指出类的构造函数里不应调用虚函数,否则会出现不确定的问题。在以上问题里,就是类似的犯了这个错误,所以是不正确的。

转载于:https://www.cnblogs.com/Salior/p/3543810.html

相关资源:JAVA上百实例源码以及开源项目
最新回复(0)