我有以下代码:
#include <windows.h>
#include <iostream>
static DWORD __stdcall startThread(void *);
class BaseClass {
private:
void threadLoop() {
// stuff ...
std::cout << someStuff() << std::endl;
// stuff ...
}
protected:
HANDLE handle;
virtual int someStuff() {
return 1;
}
public:
friend DWORD __stdcall startThread(void *);
BaseClass() {
handle = 0;
};
void start() {
handle = CreateThread(NULL, 0, startThread, this, 0, NULL);
}
~BaseClass() {
if(handle != 0) {
WaitForSingleObject(handle, INFINITE);
CloseHandle(handle);
}
}
// stuff
};
static DWORD __stdcall startThread(void *obj_) {
BaseClass *obj = static_cast<BaseClass *>(obj_);
obj->threadLoop();
return 0;
}
class DerivedClass : public BaseClass {
public:
virtual int someStuff() {
return 2;
};
};
int main() {
BaseClass base;
base.start();
DerivedClass derived;
derived.start();
}
每个实例都使用 WINAPI 和辅助函数创建一个线程,该函数startThread
将调用委托给threadLoop
创建线程的对象的方法。现在的问题是threadLoop
调用另一个虚拟方法,但是如果我创建一个具有虚拟方法的其他实现的派生类,多态性似乎不起作用。
为什么?我怎样才能解决这个问题?
编辑:我更新了代码,所以线程没有在构造函数中启动。