런타임시 메소드가 순수 가상인지 확인하는 방법이 있습니까? 사실, 파생 클래스의 소멸자가 이미 실행되었지만 여전히 기본 클래스가 살아 있는지 알 수있는 방법이 있는지 의문입니다. 메소드가 순수 가상인지 확인하십시오 (C++)
이
은 (간체) 제 경우입니다. 런타임 오류 A "라는 순수 가상 함수가"매우 산발적으로 (~ BaseClass로 실행되는 동안 해봐요가 호출 될 때 발생class BaseClass{
private:
class ThreadUtil *threadUtil;
public:
Mutex mutex;
~BaseClass(){
threadUtil->Terminate();
MutexLocker ml(mutex); // Avoid destruction during use
}
virtual Size size()=0;
};
class Derived:public BaseClass{
public:
Size size()override{return Size(100,80);}
};
class ThreadUtil{
private:
bool terminate;
BaseClass *owner;
public:
void Run(){
while(!terminate){
if (!IS_OWNER_SIZE_FN_PURE_THAT_S_THE_QUESTION){
MutexLocker ml(owner->mutex);
DoSomething(owner->size()); // Runtime error if in the dtor of BaseClass
}
}
}
};
스레드를 종료 + 파생 클래스의 잠금은 안전하지만 BaseClass에서 수행하고 싶습니다 (특히 파생 클래스가 많은 경우).
이것을 구현할 수있는 이동성이 뛰어나고 (플래그가없는) 방법이 있습니까? .. 또는 위의 d가 잘못되었습니다. esign?
편집 : -------------------- 일부로서
가 언급 한은 순수 가상 실제 문제가되지 않습니다. 스레드가 여전히 실행중인 기본 클래스의 소멸자로 들어갑니다.
- 만들기 : 실제 질문은 어쩌면 "? 는 기본 클래스에서 미리 소멸자 메소드가 할 수있는 방법이"해야 제레미 Friesner 가리키는 Is there any automated way to implement post-constructor and pre-destructor virtual method calls?에서
, 흥미로운 생각이있다 기본 클래스의 소멸자 및 파생 클래스가 보호되므로 삭제할 수 없습니다.
- BaseClass의 소멸자를 가상으로 만들기. 먼저 스레드를 종료하는) (삭제하고 기본 클래스에 구현
- 는 (있는 가상 파생 소멸자가 호출) 소멸자 당신은 여기 잘못 짚었하고
왜 기본 클래스 소멸자가 가상이 아닙니까? –
순수한 것뿐만 아니라 dtor에서 가상 기능을 호출하고 싶지는 않습니다. 보통 –
순수 가상은 여기에서 빨간색 청어입니다. 진짜 문제는'Run'은 더 이상 존재하지 않을 때 객체에 접근하려고 시도한다는 것입니다. 해결책은 소유권을 적절히 관리하는 것입니다 (예 : 원시 포인터 대신'std :: shared_ptr/weak_ptr'을 사용한다. –