私は次のコードを持っています:
#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
のは、他の仮想メソッドを呼び出すことですが、仮想メソッドの他の実装を使用して派生クラスを作成すると、ポリモーフィズムが機能しないようです。
なんで?どうすればこれを修正できますか?
編集:コードを更新したので、コンストラクターでスレッドが開始されません。