重复的:"pure virtual method called" when implementing a boost::thread wrapper interface提升线程破坏多态性
我试图创建一个使用升压线程的线程更多的面向对象版本。
所以我创建了一个Thread类:
class Thread {
public:
Thread() {}
virtual ~Thread() { thisThread->join(); }
void start() { thisThread = new boost::thread(&Thread::run, this); }
virtual void run() {};
private:
boost::thread *thisThread;
};
这个类中创建启动线程() 这样的:
thisThread = new boost::thread(&Thread::run, this);
的问题是,当我创建一个类,覆盖run()
方法,从Thread的run()
方法是由线程调用而不是新的run()
方法
,比如我有继承Thread类:
class CmdWorker: public Thread {
public:
CmdWorker() : Thread() {}
virtual ~CmdWorker() {}
void run() { /* deosn't get called by the thread */ }
};
当我做
Thread *thread = new CmdWorker();
thread.start(); //---> calls run() from Thread instead of run() from CmdWorker
但为了更加清晰:
thread.run(); calls the correct run from CmdWorker, (run() is virtual from Runnable)
任何想法,为什么出现这种情况或如何修复?
注: 我创建了一个函数(即具有无关Thread类)
void callRun(Thread* thread) {
thread->run();
}
,改变了线程创建于:
thisThread = new boost::thread(callRun, this);
当调试我注意到thread
指针指向Thread类型的对象而不是CmdWorker
编辑:
测试用例代码为:http://ideone.com/fqMLF 和http://ideone.com/Tmva1
对象似乎切片(但是这是奇怪的,因为使用指针)
没能提振添加到它
这个问题我不清楚! – Nawaz
代码不足。我看不出你会如何使用这种构造。 –
FYI'std :: thread'即将到达。无论如何,boost :: thread'究竟有什么问题? – spraff