我在 Linux 下编写的一段代码中看到了一个奇怪的行为,我想分享它,看看是否有人知道其原因。
我有一个基类和一个派生类。在基类中,我定义了一个虚拟方法,在派生类中,我使用相同的签名重新定义了该方法。然后我使用 boost bind 来启动一个线程。这是示例代码:
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 方法做了它应该做的事情,而派生类的相同方法是一个空方法,被错误地留在那里。现在,在运行上面的代码时,大多数时候 Base 类的 DoSomething 是在线程中执行的,因此应用程序运行良好,但有时却无法运行。经过一些调试后,我注意到上面的错误,并删除派生类的 DoSomething 解决了该问题。在调试模式下使用 Eclipse 似乎总是调用派生类的 DoSomething 方法,而从控制台运行应用程序在大多数情况下都有效,但并非总是如此。这种行为有原因吗?我的意思是,为什么有时绑定函数使用基类方法,有时使用派生类的相同方法?
提前致谢
编辑回复@pmr
很难展示一个完整的工作示例,我将尝试展示一些类的使用方式。
首先,我实例化一个 Derived 对象,然后在 init 函数中,我使用上面所示的初始化代码启动线程。 DoSomething 有一个在向量上迭代的 while 循环,但这不是我认为的重点。
void Derived::Init()
{
...
boost::thread *t = new boost::thread(boost::bind(&Base::DoSomething, this));
}
void Base::DoSomething()
{
while(true) {
...
}
}
void Derived::DoSomething()
{
}
正如您在这段代码中看到的,Derived DoSomething 方法是空的,所以有时我没有看到任何处理,而是在 Base DoSomething 函数中进行。