duplicado de: "pure virtual method called" when implementing a boost::thread wrapper interfacehilo impulso destruye polimorfismo
Estoy tratando de crear una versión más orientada a objetos de los hilos que utilizan hilos de impulso.
así que creé una clase 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;
};
esta clase crea el hilo de inicio() así:
thisThread = new boost::thread(&Thread::run, this);
El problema es que cuando se crea una clase que sobrescribe el método run()
, el método run()
de Subproceso se llama por el subproceso en lugar del nuevo run()
método
Por ejemplo, tengo una clase que se extiende Tema:
class CmdWorker: public Thread {
public:
CmdWorker() : Thread() {}
virtual ~CmdWorker() {}
void run() { /* deosn't get called by the thread */ }
};
cuando lo haga
Thread *thread = new CmdWorker();
thread.start(); //---> calls run() from Thread instead of run() from CmdWorker
pero sólo para ser más claro:
thread.run(); calls the correct run from CmdWorker, (run() is virtual from Runnable)
Alguna idea de por qué sucede esto o ¿Cómo se puede arreglar?
NOTA: creé una función (que no tiene nada que ver con la clase Thread)
void callRun(Thread* thread) {
thread->run();
}
y cambió la creación del hilo a:
thisThread = new boost::thread(callRun, this);
al depurar me di cuenta de que el thread
el puntero apunta a un objeto de tipo Thread en lugar de CmdWorker
EDIT:
códigocaso_prueba en: http://ideone.com/fqMLF y http://ideone.com/Tmva1
objeto parece estar en rodajas (pero esto es extraño, ya que se utilizan punteros)
no lograron añadir impulso a ella
¡La pregunta no está clara para mí! – Nawaz
No hay suficiente código. No veo cómo usarías tal construcción. –
FYI 'std :: thread' está llegando. ¿Qué es exactamente lo que está mal con 'boost :: thread' de todos modos? – spraff