2013-09-30 4 views
4

Stroustrup의 새 책을 방금 읽었습니다. 22.2.2 절에서는 dynamic_cast 문제에 대해 설명합니다.모호한 대상 클래스가있는 Dynamic_cast

I는 다음과 같이 자신이이 문제를 테스트하기 위해 작성한 코드 :

class Storable 
{ 
public: 
    int i; 
    virtual void r() {}; 
    Storable() 
    { 
     i = 1; 
    }; 
}; 

class Component:public virtual Storable 
{ 
public: 
    Component() 
    { 
     i = 1; 
    }; 
}; 

class Receiver:public Component 
{ 
public: 
    Receiver() 
    { 
     i = 2; 
    }; 
}; 

class Transmitter:public Component 
{ 
public: 
    Transmitter() 
    { 
     i = 3; 
    }; 
}; 

class Radio:public Transmitter 
{ 
public: 
    Radio() 
    { 
     i = 4; 
    }; 
}; 


int _tmain(int argc, _TCHAR* argv[]) 
{ 
    Radio *r = new Radio(); 
    Storable *s1 = dynamic_cast<Storable*>(r); 

    Component *c = dynamic_cast<Component*>(s1); // this should be 0 but it is not! 

    return 0; 
} 

Stroostrup는 언급되고 저장 가능한 버전을 알 수없는 것처럼 C는 nullptr해야한다고 설명한다. 그러나, 나는 그것을 유효한 포인터로 얻는다.

나는 Stroustrup이 아마 이것에 맞을 것이라고 추측 하겠지만 미묘하게 내가 놓친 것을 볼 수 없다.

+0

"class Component : public virtual Storable"- 여기에서 가상 키워드를 제거하고 어떤 일이 일어나는지보십시오 (http://en.wikipedia.org/wiki/Virtual_inheritance). –

+1

@ MateuszKołodziejski 아직도 아무것도 - OP의 예제는 순전히 선형의 단일 상속 계층 구조입니다. – Angew

+0

@Mateusz, 각 구성 요소마다 고유 한 저장 가능하므로 잘 작동합니다. 이 문제는 dynamic_cast에 대한 두 구성 요소의 공유 저장 용량이 있다는 것을 알고 있기 때문에 어느 것을 사용해야할지 모르며 nulptr을 반환합니다. – Stefan

답변

3

거기에는 모호성이 없습니다. 예제를 올바르게 복사 했습니까? 인용 C++ 11 [expr.dynamic.cast] §8 (dynamic_cast<C*>(v) 사용)

... 가장 파생 개체의 공개 기본 클래스 하위 개체 및 가장 파생 된 객체의 유형 v 포인트 (지칭)가있는 경우를 기본 클래스 인 C이 명확하고 public 인 경우 결과 포인트는 가장 많이 파생 된 객체의 C 하위 객체를 참조합니다. 귀하의 v

유형 Radio의 대부분의 파생 개체의 Storable 하위 객체를 가리키는하는 s1이다. RadioComponent 유형의 기본 클래스 하위 개체가 하나뿐이므로 공용이므로 동적 캐스팅이 성공해야합니다.

RadioReceiver에서도 유래 된 경우에는 일치하지 않을 수 있습니다. 아마 그걸 놓친거야?

+0

아하 !!!! 나는 그것이 쉬운 무엇인가 일 것이다라는 것을 알고 있었다. 그러나 나는 단지 그것을 볼 수 없었다! !!!!!!! – Stefan