构造函数中不应调用虚函数
?? 今天調試程序,遇到一個很費解的問題,現在做個記錄:
?? 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
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的构造函数中不应调用虚函数的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ExtJS4.x动态加载js文件
- 下一篇: 在你的 Rails App 中开启 ET