에서 캐스팅 때 다음과 같은 코드가 있습니다C++ 다형성 문제 무효 *
#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
이 다른 가상 메소드를 호출하지만 virual 메소드의 다른 구현으로 파생 클래스를 작성하면 다형성이 작동하지 않는 것입니다.
왜? 이 문제를 어떻게 해결할 수 있습니까?
편집 : 코드를 업데이트 했으므로 스레드가 생성자에서 시작되지 않습니다.
파생 클래스의 인스턴스를'startThread()'에 전달 하시겠습니까? – Nim
휴대용 표준 C++ 11 스레드를 사용할 수 있다는 것을 알고 계십니까? std :: async? 독점 API 나 악의적 인 캐스트에 간섭 할 필요가 없습니다. – sehe
@sehe 그리고 C++ 11에 대한 액세스 권한은 무엇이라고 생각합니까? –