дубликат: "чистого виртуального метода, вызываемого" при реализации интерфейса оболочки boost :: thread
Я пытаюсь создать более объектно-ориентированную версию потоков, используя потоки boost.
Итак, я создал класс 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;
};
этот класс создает поток в start () следующим образом:
thisThread = new boost::thread(&Thread::run, this);
проблема в том, что когда я создаю класс, который перезаписывает метод run()
, метод run()
из Thread вызывается потоком вместо нового run()
метода
, например, у меня есть класс, который расширяетТема:
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
Объект выглядит нарезанным (но это странно, поскольку используются указатели)
не удалось добавить повышение