C ++继承:重写时调用虚方法

C++ Inheritance : Calling virtual method when it has been overridden

我正在尝试构建一个 service 对象,它可以在单独的线程中 运行(即执行它的 run() 函数)。这是服务对象

#include <boost/noncopyable.hpp>
#include <atomic>
#include <thread>
#include <iostream>

class service : public boost::noncopyable {
 public:
  service() : stop_(false), started_(false) { }

  virtual ~service() {
    stop();
    if (thread_.joinable()) {
      thread_.join();
    }
  }

  virtual void stop() { stop_ = true; }

  virtual void start() {
    if (started_.load() == false) {
      started_ = true;
      thread_ = std::thread([&] () {
        run();
      });
    }
  }

 protected:
  virtual void run() = 0;

  std::atomic<bool> stop_;

  std::atomic<bool> started_;

  std::thread thread_;
};

我正在创建一个 test class 继承自此抽象 class 并在 main() 函数中调用

class test : public service {
 public:
  test() : service() {
    std::cout<< "CTOR" << std::endl;
    start();
  }

  ~test() {
    std::cout<< "DTOR" << std::endl;
  }

 protected:
  void run() override {
    std::cout << "HELLO WORLD" <<std::endl;
  }
};


int main() {
  test test1;
  return 0;
}

现在,当我执行此操作时,为什么会出现 pure virtual function called 错误? run() 函数显然在 test class 中被覆盖了。更糟糕的是它 运行 有时是正确的?

$ ./a.out
CTOR
DTOR
pure virtual method called
terminate called without an active exception

$ ./a.out
CTOR
DTOR
pure virtual method called
terminate called without an active exception

$ ./a.out
CTOR
DTOR
pure virtual method called
terminate called without an active exception

$ ./a.out
CTOR
DTOR
HELLO WORLD

$ ./a.out
CTOR
DTOR
pure virtual method called
terminate called without an active exception

这里可能出了什么问题?

跟随,一步一步:

1) 你构造对象。

2) 你执行下面这段代码:

if (started_.load() == false) {
  started_ = true;
  thread_ = std::thread([&] () {
    run();
  });
}

父线程立即returns到main()立即退出并销毁你的对象。

这是你的错误:

  • 您不能保证在 start() 中启动的线程会在父线程终止进程之前到达上面对 run() 的调用。子线程和父线程同时运行。

所以,每隔一段时间,父线程会在子线程启动之前销毁对象,并调用run()。

此时,调用 run() 方法的对象已经被销毁。

未定义的行为。

您偶尔遇到的断言是此未定义行为的一个可能结果。