如何在线程对象中调用多态方法?

How to call a polymorphic method in a thread object?

struct Base {
    virtual void do_work() = 0;
};

struct Derived_A : Base {
    void do_work() override {
        // work A
    }
};

struct Derived_B : Base {
    void do_work() override {
        // work B
    }
};

int main() {
    std::vector<std::unique_ptr<Base>> workers;
    workers.emplace_back(std::unique_ptr<Base>(new Derived_A()));
    workers.emplace_back(std::unique_ptr<Base>(new Derived_B()));

    std::vector<std::thread> threads;
    for (const auto& worker : workers) {
        // Compile error
        // expecting Derived_A and Derived_B do_work functions to be called respectively
        threads.emplace_back(&Base::do_work, worker);
    }
}

在线程中调用do_work()方法的正确方法是什么?

多态性应该正常工作,因为指向虚成员函数的指针在被调用时总是表现出多态性。只需要做两处更改即可使您的程序正确无误:

  1. 创建线程时必须写worker.get()。这是因为指向成员函数 Base::do_work 的指针是“可调用的”,其参数是指向 Base 的指针,但您不能直接将智能指针“传递”给它。
  2. 您必须记住在 main 结束之前分离或加入线程。