我正在使用libPoco創建一個虛擬服務器來測試某些客戶端代碼。如何調用純虛函數
class ServerRunnable: public Poco::Runnable {
public:
ServerRunnable(StreamSocket conn) : conn(conn) {
}
void run(){
string mess("Can you hear me?\n");
try{
this->conn.sendBytes(mess.c_str(), mess.size());
} catch (Poco::Exception& ex){
cerr << ex.displayText() << endl;
return;
}
cerr << "The message has been sent." << endl;
}
void setConn(StreamSocket inConn){
this->conn = inConn;
}
private:
StreamSocket conn;
};
int main(int argc, char **argv){
ServerSocket s;
try{
s.bind(8083, true);
} catch (Exception &ex){
cerr << ex.displayText() << endl;
exit(1);
}
s.listen(124);
Poco::ThreadPool Pool(10, 25, 60, 128);
while(1){
try{
StreamSocket conn = s.acceptConnection();
ServerRunnable serveIt(conn);
Pool.start(serveIt);
} catch (Exception &ex){
cerr << ex.displayText() << endl;
Pool.joinAll();
exit(1);
}
}
return 0;
}
Poco::Runnable
是一個抽象類,而且我敢肯定,運行是一個純虛函數。 Pool.start(serveIt)
似乎要求ServerRunnable
的run
。當我從控制檯運行它時,我始終得到pure virtual method called
錯誤。但是,如果我在gdb中單步執行代碼,那麼我將成功接受來自客戶端的連接並向其發送數據。 ServerRunnable
的run
不是一個純粹的虛函數,應該被稱爲。
爲libPoco的線程代碼示例是在http://pocoproject.org/slides/130-Threads.pdf
我也在想,我可能會調用構造函數純虛方法,但並沒有什麼的構造器,我只是使用默認destuctor。有沒有辦法確定在哪裏調用純虛函數?在gdb中?謝謝。
我同意這可能是發生了什麼事。導致純虛擬函數被調用的一般情況是,在構造函數完成之前或析構函數開始之後調用虛函數。 –