поток ускорения уничтожает полиморфизм

дубликат: "чистый виртуальный метод, вызываемый" при реализации интерфейса оболочки 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 () из потока вызывается потоком вместо нового 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 вместо CmdWorker

EDIT:

код тестового примера по адресу: http://ideone.com/fqMLF и http://ideone.com/Tmva1

Объект кажется нарезанным (но это странно, поскольку используются указатели)

не удалось объявить d увеличить его

5
задан Community 23 May 2017 в 12:04
поделиться