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

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

   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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值