2013-05-04 1 views
5

이 코드가 작동하지 않는 이유는 무엇입니까?dynamic_pointer_cast를 사용할 때 동적 캐스트를 수행 할 수 없습니다.

std::shared_ptr<Event> e = ep->pop(); 
std::shared_ptr<TrackerEvent> t; 

t = std::dynamic_pointer_cast<TrackerEvent>(e); 

나는 다음과 같은 오류가 발생합니다 : Event에서

/usr/include/c++/4.6/bits/shared_ptr.h:386: error: cannot dynamic_cast '(& __r)->std::shared_ptr<Event>::<anonymous>.std::__shared_ptr<_Tp, _Lp>::get [with _Tp = Event, __gnu_cxx::_Lock_policy _Lp = (__gnu_cxx::_Lock_policy)2u]()' (of type 'class Event*') to type 'class TrackerEvent*' (source type is not polymorphic) 

TrackerEvent 상속 그래서 난 문제가 내가이 방향에 캐스팅 할 수없는 것 같다. 그러나 ep->pop()Event 또는 TrackerEvent 유형의 객체를 반환 할 수 있습니다. 그리고 나는 ... 나는 TrackerEvent에 캐스팅하려고하고 NULL을 반환 할 때 내가 Event 또는 TrackerEvent이 있는지 내가 아는 것이라고 기대했다

내가 어떻게 할 것인가?

+3

당신이 필요 dynmaic_cast를 사용하기위한 적어도 하나의 가상 메소드가 있어야합니다. – stardust

답변

10

컴파일러는 메시지의 끝에서 무슨 일이 일어나고 있는지를 말하고있다 동적 캐스트를 허용하려면 당신은 가상 Event의 소멸자를 만들 수 :

여기
class Event 
{ 
public: 
    virtual ~Event() { /* whatever goes here, or nothing... */ } 
    // ... 
}; 

는 코드 컴파일 (가상 소멸자를 제거하기는 컴파일 오류 similar to the one you are seeing을 일으킬 것) 것을 보여주는 live example with polymorphic types입니다. (컴파일러는이 점에서 C++ (11)을 준수하는 경우)으로 정확하게 코멘트에 Luc Danton 언급

는 가상 소멸자의 채무 불이행 버전이 방법을 정의 할 수 있습니다 :

class Event 
{ 
public: 
    virtual ~Event() = default; 
    // ... 
}; 
+0

@LucDanton : 맞아, 그 얘기는 깜빡 했어. 편집 됨, 감사합니다. –

3

dynamic_cast을 수행하려면 전송하려는 유형이 다형성이어야합니다. 이것이 사실 일 수 있으려면 일부 가상 멤버가 있거나 상속되어야합니다. Event에 최소한 가상 소멸자가있는 가상 멤버 함수가 있는지 확인하십시오. 에 (즉,이 다형성 유형 수)

(source type is not polymorphic)

귀하의 Event 기본 클래스는 적어도 하나 개의 virtual 멤버 함수를 가질 필요가 :

관련 문제