是否可以将对基类的引用传递给boost :: thread,并在派生类中调用虚函数?

时间:2012-11-21 05:57:04

标签: c++ boost boost-thread

假设我有:

class Base
{
    public:

        void operator()()
        {
            this->run();
        }

        virtual void run () {}
}

class Derived : public Base
{
    public:

        virtual void run ()
        {
            // Will this be called when the boost::thread runs?
        }
}

int main()
{
    Base * b = new Derived();
    boost::thread t(*b); // <-- which "run()" function will be called - Base or Derived?
    t.join();
    delete b;
}

从我的测试中,我无法调用Derived::run()。我做错了什么,或者这是不可能的?

2 个答案:

答案 0 :(得分:2)

通过传递*b您实际上“切片”Derived对象,即按值传递Base个实例。 你应该通过指针(或智能指针)传递Derived仿函数,如下所示:

thread t(&Derived::operator(), b); // boost::bind is used here implicitly

当然,要注意b的生命周期。

答案 1 :(得分:0)

@ GManNickG的评论是最干净的答案,并且完美无缺。 Boost.Ref是要走的路。

thread t(boost::ref(*b));