首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >boost线程破坏多态

boost线程破坏多态
EN

Stack Overflow用户
提问于 2011-09-13 01:59:13
回答 4查看 1.6K关注 0票数 5

复制地址:"pure virtual method called" when implementing a boost::thread wrapper interface

我正在尝试使用boost线程创建一个更面向对象的线程版本。

所以我创建了一个Thread类:

代码语言:javascript
复制
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的类:

代码语言:javascript
复制
class CmdWorker: public Thread {
public:
    CmdWorker() : Thread() {}
    virtual ~CmdWorker() {}

    void run() { /* deosn't get called by the thread */ }
};

当我这样做的时候

代码语言:javascript
复制
Thread *thread = new CmdWorker();
thread.start(); //---> calls run() from Thread instead of run() from CmdWorker

但更清楚的是:

代码语言:javascript
复制
thread.run();  calls the correct run from CmdWorker, (run() is virtual from Runnable)

你知道为什么会发生这种情况吗?或者如何修复它?

注意:我创建了一个函数(与Thread类无关)

代码语言:javascript
复制
void callRun(Thread* thread) {
    thread->run();
}

并将线程创建更改为:

代码语言:javascript
复制
thisThread = new boost::thread(callRun, this);

在调试时,我注意到thread指针指向的是Thread型对象,而不是CmdWorker

编辑:

测试用例代码位于:http://ideone.com/fqMLFhttp://ideone.com/Tmva1

对象似乎是分片的(但这很奇怪,因为使用了指针)

我没有设法给它添加助推器

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-09-13 02:59:48

答案就在这个问题中:

"pure virtual method called" when implementing a boost::thread wrapper interface

基本上,当boost::thread对象开始运行时,运行它的对象有时间被删除。

在销毁对象之前,您必须实现手动调用的join方法。

票数 3
EN

Stack Overflow用户

发布于 2011-09-13 02:24:11

ThreadThread线程调试时,我注意到线程指针指向

类型的对象,而不是CmdWorker

也许在代码中的某个地方,CmdWorker对象被切分(即按值复制)为Thread对象?

在最小的测试用例下,你会得到相同的行为吗?

票数 2
EN

Stack Overflow用户

发布于 2011-09-13 02:05:37

通过对非虚函数执行&Thread::Run,可以强制任何从Thread类派生的类使用Thread基类中指定的函数。试着让Thread::运行一个虚拟的void,看看这是否能解决你的问题。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7391920

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档