리눅스에서 작성한 코드 조각에서 이상한 동작을 보았습니다. 누군가 그 원인을 알고 있는지 공유하고 싶습니다. 기본 클래스와 파생 클래스가 있습니다. 기본 클래스에서 가상 메서드를 정의했으며 파생 클래스에서 동일한 서명으로 해당 메서드를 다시 정의했습니다. 그런 다음 boost를 사용하여 스레드를 시작합니다.가상 함수 및 부스트 바인딩 이상한 동작
기본 클래스의 해봐요 방법은 그것을 할 예정이었다 무슨 짓을했는지boost::thread *t = new boost::thread(boost::bind(&Base::DoSomething, this));
반면, 같은 방법 : 내가 이런 짓을 파생 클래스의 초기화 방법에
Class Base {
public:
virtual void DoSomething();
virtual void Init() = 0;
...
}
Class Derived : public Base {
public:
void DoSomething();
void Init();
...
}
: 다음은 샘플 코드는 파생 된 클래스의 메서드는 비어있는 메서드였으며 실수로 거기에 남아있었습니다. 위의 코드를 실행하는 동안, 대부분의 경우 Base 클래스의 DoSomething이 스레드에서 실행되었으므로 응용 프로그램이 제대로 작동하지만 때로는 작동하지 않는 경우가있었습니다. 일부 디버깅 후에 위의 실수를 지적하고 파생 클래스의 DoSomething을 제거하면 문제가 해결됩니다. 디버그 모드에서 이클립스를 사용하면 파생 클래스의 DoSomething 메서드가 항상 호출되는 것처럼 보이지만 콘솔에서 응용 프로그램을 실행하는 것은 대부분의 경우에 작동하지만 항상 그런 것은 아닙니다. 이 행동에 대한 이유가 있습니까? 왜 때로는 바인드 함수가 기본 클래스 메서드를 사용하고 때로는 파생 클래스의 동일한 메서드를 사용하는 것입니까? 사전에
덕분에 응답
편집
전체 작업 예제를 보여 어려울 것이다, 내가 클래스를 사용하는 방법을 조금 보여주기 위해 노력할 것입니다 @pmr합니다.
먼저 파생 된 개체를 인스턴스화 한 다음 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()
{
}
당신이 그렇게 가끔 대신 기본 해봐요 기능에서 일어났다 어떤 처리를 보지 못했다, 파생 해봐요 방법은 비어있는이 코드에서 볼 수 있듯이.
최소한의 편집 가능한 예를 제공하는 데주의해야합니까? 또는 최소한 클래스 사용 방법을 보여줍니다. – pmr