我有一个子类,它将基类的方法作为线程启动。子类还实现了基类的纯虚方法。然后线程需要在线程中调用子实现版本的纯虚方法,但是线程抛出异常:“调用了纯虚方法”。下面的代码演示了在构造 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