基本/派生类中称为C ++的纯虚函数

时间:2017-08-17 07:35:56

标签: c++ multithreading

我有这个基类:

let und = undefined;

if (true || (und ? und.toString() === 'anything' : false)) {
  console.log('Yeah, no error thrown');
}

和这个派生类:

class Base {
public:
  Base();
  virtual ~Base();
protected:
  virtual on_next_item(std::string& item) = 0;
private:
    void read_loop();
};

class Derived : public Base { public: Derived(); virtual ~Derived(); protected: void on_next_item(std::string& item) override; }; 类构造函数中,我启动一个从套接字读取并调用在派生类上调用的Base的线程。 在on_next_item()析构函数中,读取器线程通过原子标志停止。 但有时Base仍会调用read_loop,我会得到一个名为!"的纯虚函数!错误。我假设我在竞争条件下跑步:

子类(对象)已经被破坏,因此该函数不再被注册。

有没有正确的方法来解决这种竞争条件?

为了完整性,读者循环:

on_next_item

while (running.load()) { string item = read(); if (running.load()) { on_text_item(item); } } 类析构函数中的运行标志切换为false。

编辑(完整的运行示例,必须多次执行才能在问题中运行):

Base

谢谢!

2 个答案:

答案 0 :(得分:4)

从构造函数或析构函数调用虚函数是generally considered a bad idea。函数调用实际上就像函数不是虚函数一样,因为此时Derived的构造函数尚未被调用,成员变量或Derived仍然未初始化...

显而易见的解决方案是将类的逻辑移动到公共成员函数,并在创建对象后立即调用该函数:

Derived d;
d.run();

答案 1 :(得分:0)

我建议进行以下更改 -

  1. 设置"运行"标志为false里面~Derived()而不是~Base()。 更改"运行"的访问级别保护。

    虚拟〜派生()    {        running = false;    }

  2. 从阅读器循环中删除睡眠

    while(running.load())    {
          on_next_item(元件);    }