dynamic_cast
을 사용하여 클래스 계층 구조 전반에 걸쳐 "크로스 캐스트"를 수행하는 것이 합법적이라는 것을 알고 있습니다. 내가 수업을 예를 들어, 다음과 같이한다 : I 유형 C
의 객체 가리키는 것 A*
포인터가있는 경우크로스 캐스트가 작동 할 수 있는지 여부를 확인 하시겠습니까?
A B
\/
C
, 그때 나는에 대한 포인터를 얻을 수
A* aPtr = /* ... something that produces a C* ... */
B* bPtr = dynamic_cast<B*>(aPtr);
을 사용할 수 있습니다 B
기본 개체는 C
입니다.
나는 이것을 언급하는 이유는 내가 위의 코드를 작성할 때,이 컴파일러는 아직이 A
및 B
을 볼 비록 C
의 정의를 볼 수없는 것을 가능성이 있다는 것입니다. 즉, 컴파일러가 A
과 B
사이의 연결을 감지하지 못할 수도 있지만 어떤 경우에는 C
클래스가 존재하고 dynamic_cast
클래스가 성공할 수 있기 때문에 여전히 코드를 컴파일해야합니다.
이것은 내가 실수로 잘못된 유형의 객체로 크로스 캐스트 할 수 있다는 것을 의미합니다.
다음A B D
\/
C
, D
는 어떤 임의의 관련이없는 클래스 : I는 다음과 같이 수업을한다고 가정하자. A
및 D
를 연결 할 수있는 방법이 없기 때문에
A* aPtr = /* ... get a C* pointer ... */
D* dPtr = dynamic_cast<D*>(aPtr);
다음이 dynamic_cast
항상 런타임에 실패 할 것이다 : 나는 이런 식으로 뭔가를 작성하려고합니다. 내가 B
을 사용하기 때문에 우연히 D
을 사용하고 있다면, 컴파일러는 의미없는 캐스트가 있다는 것을 전혀 알려주지 않을 것입니다.
내 질문은 : 내가 런타임에 캐스트가 항상 실패한다는 것을 경고하기 위해 컴파일러를 얻을 수있는 방법이 있습니까? 언어 수준의 솔루션이나이를 감지 할 수있는 주요 컴파일러에 대한 일부 컴파일러 설정에 만족합니다. 외부 도구가 있다면 괜찮습니다. 이 오류 클래스를 포착 할 수 있는지 알고 싶습니다.
이것은 꼭 링커 레벨 일 필요가 있습니까? 컴파일 할 때'A'와'D'에서 파생 된 클래스가 생성되지 않을 수도 있다는 것을 알지 못합니까? – Keith
@ Keith- 당신이 전지용 컴파일러를 가지고 있지 않다면 확실히. 이봐 요, 그 중 하나를 원합니다 :-) – templatetypedef
@ 키스 : 링커조차도 내 대답에 설명 된대로 모든 유형에 대한 완전한 정보를 가지고 있지 않을 수도 있습니다. –