如何调用纯虚函数

Cal*_*orm 4 c++

我正在使用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;
 }
Run Code Online (Sandbox Code Playgroud)

Poco::Runnable是一个抽象类,我很确定run是一个纯虚函数.Pool.start(serveIt)似乎被调用ServerRunnablerun.当我从控制台运行它时,我总是遇到pure virtual method called错误.但是,如果我在gdb中逐步执行代码,那么我将成功接受来自客户端的连接并向其发送数据.ServerRunnablerun不是一个纯虚函数,应该被称为.

libPoco线程的代码示例位于http://pocoproject.org/slides/130-Threads.pdf

我也在想我可能在构造函数中调用纯虚方法,但是在构造函数中没有任何东西,我只是使用默认的destuctor.是否有某种方法可以确定调用哪些纯虚函数?在gdb?谢谢.

Som*_*ude 7

问题很可能是在调用方法serverIt之前,对象超出了范围run.

您无法控制线程何时可以运行,因此可能是run在调用类的方法之前循环迭代,但是您的对象已被销毁,当然还有虚拟函数表的销毁.

  • 我同意这可能发生的事情.导致调用纯虚函数的一般情况是在构造函数完成之前或析构函数开始之后调用虚函数. (2认同)