我试图让一个类运行一个线程,它将在循环中调用名为Tick()的虚拟成员函数。然后我试着派生一个类并覆盖base :: Tick()。C++ 11线程不能使用虚拟成员函数
但是当执行时,程序只调用基类的Tick而不是覆盖一个。任何解决方案
#include <iostream>
#include <atomic>
#include <thread>
#include <chrono>
using namespace std;
class Runnable {
public:
Runnable() : running_(ATOMIC_VAR_INIT(false)) {
}
~Runnable() {
if (running_)
thread_.join();
}
void Stop() {
if (std::atomic_exchange(&running_, false))
thread_.join();
}
void Start() {
if (!std::atomic_exchange(&running_, true)) {
thread_ = std::thread(&Runnable::Thread, this);
}
}
virtual void Tick() {
cout << "parent" << endl;
};
std::atomic<bool> running_;
private:
std::thread thread_;
static void Thread(Runnable *self) {
while(self->running_) {
self->Tick();
std::this_thread::sleep_for(std::chrono::milliseconds(100));
}
}
};
class Fn : public Runnable {
public:
void Tick() {
cout << "children" << endl;
}
};
int main (int argc, char const* argv[])
{
Fn fn;
fn.Start();
return 0;
}
输出:
parent
就我个人而言,我认为解决这个问题并不是最好的解决方案。我认为最好的解决方案是首先不要造成这个问题。对于非问题来说,这是一个糟糕的解决方案。 –
不要用C++编写Java。 –
你说得对。我为捕捉系统做了这个工作,它会以恒定的频率查询一些源,例如10次/秒,并将数据提取到队列中。并且有一个监视器将以另一个恒定频率从队列中拉出并显示数据。因此,这是我想出的解决方案,创建一个基类,然后使用向量/列表来保存所有的源和监视器(而源可以在运行时添加/删除)。有更好的解决方案 – xiaoyi