2013-04-29 1 views
5

저는이 사이트에서 다른 스레드를 읽었으며 dynamic_cast와 static_cast가 업 캐스팅에서 어떻게 안전한지 언급합니다.캐스팅 - 업 캐스팅을 위해 왜해야합니까?

왜 이것이 상영을 위해 필요합니까?

A * ptr = new B(); 

다음 예를 들어

, 클래스 B가 A로부터 파생되는 경우는, 여전히 작동하고, A 형의 객체 (나는 upcasting에 대한 변환이 불필요 자바 배경에서도 오전처럼 동작합니다. upcasting가 자동으로 발생하기 때문에

나는 또한 downcasting 필요하지 않습니다 dynamic_cast는이 사이트에서 읽을 [질문에 "When should static_cast, dynamic_cast, const_cast and reinterpret_cast be used?은"] . 다시 말하지만, 나는 주조 당신이 downcasting 경우에만 정말 필요하다고 생각합니다.

어디서 잘못 되었나요?

+0

참고 : 이전 질문에서 대답 중 하나는 "당신은 아래로 던지기 위해 그것을 사용할 필요가 없습니다 ..."라고 말합니다. 그러나 전체 문장의 맥락에서 의미는 당신이 아래쪽으로 캐스팅하기 위해서만 사용하는 것에 국한되지 않는다는 것입니다. [나는 애매함을 없애기 위해 그 대답을 편집했다.] –

답변

3

복잡한 상속 계층이있는 경우 기본 유포자 동작이 작동하지 않을 수 있습니다. 예컨대 고려 : 해당 계층에서

struct A {}; 
struct B : A {}; 
struct C : A {}; 
struct D : B, C {}; 

입력 D의 개체 유형 A 두 가지 기지를 갖는다. D*에서 A*으로의 변환은 모호합니다.

A *p = static_cast<B*>(d); // Give me the 'A' subobject within 'B' 

마찬가지로 당신이 중간 단계를 거치지 강제 수있는 경우 이러한 유형의 경우,이 기본 또는 파생 된 유형 중 하나를 취할 수있는 여러 오버로드와 함수이고 당신은 기본을 복용 버전을 호출해야하는 경우 유형 (참고 : 코드 냄새가 여기!) 그러면 과부하 해결을 위해 캐스트를 사용할 수 있습니다. 다시 말하지만, 과부하 해결을 지시해야하는 경우 아마도 다른 잘못된 작업을 수행하고있을 것입니다.

코너 케이스 (예 :기본 업 캐스팅이 작동하지 않을 때 실제로 캐스팅 작업을 명시 적으로 사용할 이유가 없습니다. 캐스팅은 경고 표시등이어야하고이를 과도하게 사용하면 이 보통이되고 읽을 때 알람을 발생시키지 않으므로 실제로 캐스팅 작업에 대한 조언이됩니다. 암호.

+1

좋은 코너 케이스 예제지만, 어쨌든 코드베이스에서 절대 발생해서는 안되는 나쁜 코드이기 때문에 실제적인 관련성에 의문을 제기 할 것입니다. (죽음의 다이아몬드) 적어도 업 캐스트와 함께. –

0

왜 이것이 상영을 위해 필요합니까?

그들은 없으며, 업 캐스팅을 위해 그들을 사용하는 것은 오해의 소지가 (IMHO) : 더 캐스팅 이유에 대한 필요하지 않습니다 : 논리적으로, 서브 클래스의 객체가-슈퍼 클래스의 인스턴스입니다.

요약하면 명시적인 업 캐스트는 권장하지 않습니다. 나는 적어도 일관성을 요구하는 주장 사람들을 위해 : initialisations에 포함 사방 명시 적으로 업 캐스팅을 사용

A * ptr{static_cast<A*>(new B)}; 

대부분의 사람들이 그냥 바보 것에 동의합니다.

+0

그게 내가 생각한 것. 그런데 왜 673 개의 상향 회선에 대한 대답이 "동적 캐스트에 대해 아래쪽으로 캐스트 할 필요가 없다"고 대답하는 이유는 무엇입니까? http://stackoverflow.com/questions/332030/when-should-static-cast-dynamic-cast- 및 재 해석 캐스팅 될 수 있습니다. 근본적으로 내 이해에 문제가 있다고 생각했기 때문에 그 글에 게시하지 않았다. – user929404

+1

@ user929404 당신은 그 답을 오해하고있다. 실제 메시지는'reinterpret_cast'가 다운 캐스트를 위해서 일뿐만 아니라 다른 캐스트도 수행 할 수 있다는 것이다. . 그러나 게시판에 실제로 업셀에 * 사용하는 것에 대해서는 아무런 언급이 없습니다 (다른 온라인 댓글은 이것을 권유합니다). –

1

다중 상속 (자바가 실제로 갖고 있지 않은)의 경우 "this"포인터를 조정할 수 있습니다. 이 경우 reinterpret_cast는 안전하지 않습니다. static_cast 및 dynamic_cast가 안전하다고 말하는 것으로 강조하려고합니다.

dynamic_cast없이 Android에 포팅 된 코드베이스의 조사에서 127 개의 dynamic_cast를 발견했습니다. 그 중 122 개는 실제로 필요하지 않았습니다. 이것은 C++에 능숙한 사람들이 작성한 코드입니다.

관련 문제