2012-12-02 1 views
1

이 문제를 해결하는 방법을 알고 싶습니다. 나는이 질문이 저를 요구하고있다 이해하지 않습니다법률 dynamic_cast

dynamic_cast<Y>(new X) 
  • 법적 될 수?
  • 아마도 성공할까요?
+2

어떻게해야할까요? –

+0

''Y''와''X'의 어떤 타입의 조합이이 코드를 합법적으로 만들고'Y'와'X'의 어떤 타입의 조합이 성공할 것 같 냐고 묻습니다. 예를 들어'Y'가'X'의 기본 클래스이고 가상 소멸자를 가지고 있다면 ... –

답변

1

Y와 X를 모른 채로는 완전히 대답 할 수 없습니다. 예를 들어, Y가 int 인 경우 불법입니다. 그렇지 않으면 Y가 다형성 클래스에 대한 포인터라면 성공할 수도 있고 그렇지 않을 수도 있지만 확실한 것은 없습니다. 마지막으로, 이것은 다소 불쾌한 메모리 누수입니다.

3

질문은 다음과 같아야합니다

무엇을 당신은 X의 정의에 대해 말하고 Y 그래서 다음 코드는 법적 것을, 나아가 캐스트는 성공할 수 있을까?

그런 대답은 매우 솔직하다 : Xnew 표현이 합법적 할 수있는 완전한 형태이어야한다. 동적 캐스트는 가상이 아닌베이스로 캐스팅 할 때 유효합니다. 따라서 Y이 가상이 아닌베이스 (가능하면 CV 규정 및 X 자체에 대한 포인터 포함)에 대한 포인터 인 경우 캐스트는 유효 이 성공합니다.

또한 다형성 유형 (즉, 가상 함수가있는 클래스)에서 동적 캐스트의 다른 유효한 용도가 있습니다. X이 다형성 인 경우 Yvoid * 일 수 있으며 YX의 상속 계층 구조의 다른 클래스에 대한 포인터 일 수 있습니다. 그러나 캐스트는 이면 Y이베이스에 대한 포인터 인 경우에만 사용됩니다 (그러나이베이스는 가상 일 수 있습니다).

(우리가 이미 castee의 동적 유형을 알고 있기 때문에 본의 추론은, 임의의 동적 캐스트보다 간단하다. 일반적으로, 동적 캐스트가 훨씬 더 복잡한 일을 할 수 있습니다.)

+0

Y는 X의 기본 클래스에 대한 포인터 여야합니다. –

+0

@ ÖöTiib : 예, 그렇습니다. 감사! –

+0

그건 사실이 아니야. 'Y'가'X'의 기본 클래스에 대한 포인터 인 경우'X'는 다형성 일 필요는 없습니다. 그리고 만약'Y'가'void *'이면 캐스트는 성공할 것입니다 (그러나'X'가 다형성 인 경우에만 유효합니다). –

3

첫째,에 유효하면 Y은 포인터 유형이어야합니다. 그러면 은 dynamic_cast<Y cv_qualifiers*>(new X)으로 질문을 다시 작성합시다. X 완전한 클래스 타입이며, 하나 X 경우 다형성 유형, 또는 YX와 동일한 유형 또는 X의 기본 클래스의 경우이 작업을 수행하는 데, 그것은 법률입니다.

YX와 동일 또는 X의 기본 클래스입니다 경우이 성공합니다. 이러한 경우에, dynamic_caststatic_cast 같은 동작을 가지고 있으며, 하나는 일반적으로 그냥 캐스트없이 new X, 를 작성합니다 그래서 사실에서, 암시 적 변환에 해당합니다. (거기에 void* 매개 변수에 결과를 전달할 때 캐스트 는 일반적으로 필요할 수 있습니다 몇 가지 특별한 경우가 그러한 경우에, 나는 static_cast을 선호한다.하지만, 두 가지의 의미가 바로이 경우에 동일합니다.)

마지막)도 성공할 것이다 (한 특별한 경우가있다 : X이 다형성 타입이며, Yvoid cv_qualifiers * 경우. 이 경우, dynamic_cast static_cast 상이한 의미를 가질 않는 X*의 유형을 가장 파생 형 ”, 동일한 (그리고 다시 동일하다 실제 효과 “ 포인터를 가질 것이다 new X로부터 돌려 보낸 있지만 암시 적으로 변환).

+0

가상베이스에서는 정적 캐스트가 작동하지 않습니다! –

+0

@KerrekSB 좋은 지적. 그것은'dynamic_cast'가 필요한 또 다른 경우입니다. –

+0

나는'Y'도 참조 형이 될 수 있다고 생각합니다. 내가 잘못? –