c++ - 从子类中的线程调用纯虚函数抛出异常

标签 c++ multithreading inheritance c++11 virtual

我有一个子类将基类的方法作为线程启动。子类也从基类实现了一个纯虚方法。然后线程需要在线程中调用子进程的纯虚方法的实现版本,但是线程抛出异常:“Pure virtual method called”。下面的代码演示了在构造 Child 时会发生什么:

class Base {
  std::thread messageThread;

  virtual void processMessage(std::string msg) = 0;

  static void checkForMessages(Base *c) {
    while(true) {
      std::string msg = "Hello";
      c->processMessage(msg);
    }
  }
};

class Child : public Base {
  Child() {
    messageThread = std::thread(checkForMessages, this);
  }

  void processMessage(std::string msg) {
     std::cout << "Message: " << msg << std::endl;
  }
};

我的理解是,在构造函数完成之前,Child 仍被视为 Base,因此线程只能将 processMessage 视为纯虚函数。我可以为 Base 的每个子级实现 checkForMessages,但这首先违背了拥有 Base 类的目的。

如何正确实现?感谢您的帮助!

编辑:演示问题的完整示例,并尝试修复:https://gist.github.com/4590476

最佳答案

您可以将 std::thread(checkForMessages, this) 移动到一个单独的 start() 方法中,该方法必须在对象构建后由调用者调用。

关于c++ - 从子类中的线程调用纯虚函数抛出异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14448506/

相关文章:

c++ - C++中的S后缀字符串文字给出错误

c# - 使用本地线程的单元测试方法

java - 如何监视 Java 线程堆栈的内存

Javascript - 私有(private)变量起作用?

c++ - 将继承的方法传递给另一个方法

c# - 继承一个接口(interface),实现部分方法,让派生类实现其余部分

C++ 迭代器 "remove-proof"

c++ - 从这张图片中识别绿色圆圈

c++ - 为 while 循环创建超时的最简洁方法是什么?

c++ - 无法初始化线程 vector