假设我有:
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()
。我做错了什么,或者这是不可能的?
答案 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));