2012-04-10 3 views
0

나는 떨어져 복사 스레드 클래스의 약간 수정 된 버전을 가지고있는 나는 스레딩 기본 클래스 만드는 데 사용했다 Linux Self Help 사이트 :스레드에서 오버로드 된 멤버가 호출되지 않는 이유는 무엇입니까?

class Item : public Thread 

: 나는 2 개 스레드 수업을

class Thread 
{ 
public: 
static void *entry (void *pvArg) { Thread *pobjThread = static_cast<Thread *> (pvArg); pobjThread->run(); } 
virtual void run (void) = 0; 
}; 

class Product : public Thread 

class Item이 함수의 생성자에서 스레드를 시작합니다.이 클래스는 pthread 라이브러리를 으로 entrypvArg으로 호출하는 스레드를 생성하고 class Product은 프로그램 실행 중에 나중에 스레드를 생성합니다.

이제 문제는 class Item이 잘 작동합니다. run 함수가 호출되어 올바르게 처리됩니다.

pure virtual method called 

두 클래스는 run 방법을 오버로드와 같은 구현을 가지고 있지만 하나라고하며 다른 하나는되지 않습니다 : class Product 나중에 같은 함수를 호출 할 때 그러나, 나는 얻는다.

왜 갑자기 pure virtual method called 예외가 발생합니까?

감사합니다.

업데이트 : Item가 CPP 파일에 static Item item;로 선언하고 하나가되어 class Product 때문에 class Item는 다르다. class Product은 일반 개체처럼 사용됩니다. 만약 내가 같은 일을 class Product 잘 작동합니다.

+0

'제품'이 '항목'에서 파생되지 않았습니까? 그것은 오류를 설명합니다. – modelnine

+0

@PlasmaHH - 예외는 정상적으로 호출되는 클래스에서 발생합니다. 'Item'의 ctor로부터 호출이 올바르게 작동하고 있습니다. – user626201

+0

@ modelnine - 아니요, 그들은 분명히 다른 클래스입니다. 연결이 없으며 헤더 포함 (스레드 헤더 제외)에 포함되지 않습니다. – user626201

답변

0

modelnine이 지적한 바에 따르면 문제가되는 코드가 스레드를 시작한 다음 개체를 파괴하는 객체를 만드는 것이 발견되었습니다. 이것은 modelnine이 지적한 것처럼 vtable을 삭제하고 이로 인해 문제가 발생했습니다.

질문에 대한 의견에 modelnine에게 감사드립니다.

0

항목 및 제품은 다음과 같습니다. public Thread는 생성자 내부에 가상 함수 (자체)를 호출한다는 것을 의미합니다. 생성자 내부에서 vtable은 아직 완전히 설정되지 않았으므로 (초기화되는 각 기본 클래스에 따라 달라 지므로) 정의되지 않은 동작이 발생합니다.

모범 사례 : 생성자/소멸자 내부에서 가상 함수를 호출하지 마십시오. 생성자/소멸자를 매우 간단하게 유지하고 나머지 작업은 init() 함수 내에서 수행하십시오.

+0

@phresnel : 순수한 가상 함수를 호출하는 것은 금지되어 있습니다. 생성자에서 비 순수 함수를 호출하는 것은 잘 정의되어 있으며 때로는 합리적인 일이 될 수 있습니다. –

+0

@MikeSeymour : 여하튼 나는 실제로 "순전 한"것을 읽는다. 그러나 나는 읽는 동안 나의 잠재 의식 저글링 단어를 너무 많이 추측한다. –

관련 문제