我在Linux下编写的一段代码中看到了一个奇怪的行为,我想分享一下,看看是否有人知道这个原因。 我有一个基类和一个派生类。在基类中,我定义了一个虚拟方法,并在派生类中重新定义了该方法,并使用相同的签名。然后我使用boost绑定来启动一个线程。下面是一个示例代码:虚拟函数和提升绑定奇怪行为
Class Base {
public:
virtual void DoSomething();
virtual void Init() = 0;
...
}
Class Derived : public Base {
public:
void DoSomething();
void Init();
...
}
在派生类中我这样做的init方法:
boost::thread *t = new boost::thread(boost::bind(&Base::DoSomething, this));
基类的DoSomething的方法做了什么,它的意思做的,而同样的方法的派生类是一个空的方法,留在那里是错误的。现在,在运行上面的代码时,大部分时间都是在线程中执行了基类的DoSomething,所以应用程序运行正常,但有时无法正常工作。经过一些调试后,我注意到上面的错误,并删除派生类的DoSomething解决了这个问题。在调试模式下使用Eclipse似乎始终调用派生类的DoSomething方法,而在大多数情况下从控制台运行应用程序却并非总是如此。是否有这种行为的原因?我的意思是,为什么有时候绑定函数会使用基类方法,有时也会使用派生类的相同方法?
在此先感谢
编辑回应@pmr
这将是很难表现出一个完整的工作示例,我会尽量表现出位的类是如何使用的。
首先我实例化一个Derived对象,然后在init函数中我用上面显示的初始化代码启动线程。 DoSomething有一个while循环,它在vector上迭代,但这不是我想的。
void Derived::Init()
{
...
boost::thread *t = new boost::thread(boost::bind(&Base::DoSomething, this));
}
void Base::DoSomething()
{
while(true) {
...
}
}
void Derived::DoSomething()
{
}
正如你在代码中派生DoSomething的方法是看空的,所以有时候我没有看到任何处理,这反而发生在基地的DoSomething函数。
小心提供一个最小的可编译示例?或者至少说明课堂是如何使用的。 – pmr