이 문제를 해결하는 방법을 알고 싶습니다. 나는이 질문이 저를 요구하고있다 이해하지 않습니다법률 dynamic_cast
dynamic_cast<Y>(new X)
- 법적 될 수?
- 아마도 성공할까요?
이 문제를 해결하는 방법을 알고 싶습니다. 나는이 질문이 저를 요구하고있다 이해하지 않습니다법률 dynamic_cast
dynamic_cast<Y>(new X)
Y와 X를 모른 채로는 완전히 대답 할 수 없습니다. 예를 들어, Y가 int 인 경우 불법입니다. 그렇지 않으면 Y가 다형성 클래스에 대한 포인터라면 성공할 수도 있고 그렇지 않을 수도 있지만 확실한 것은 없습니다. 마지막으로, 이것은 다소 불쾌한 메모리 누수입니다.
질문은 다음과 같아야합니다
무엇을 당신은
X
의 정의에 대해 말하고Y
그래서 다음 코드는 법적 것을, 나아가 캐스트는 성공할 수 있을까?
그런 대답은 매우 솔직하다 : X
는 new
표현이 합법적 할 수있는 완전한 형태이어야한다. 동적 캐스트는 가상이 아닌베이스로 캐스팅 할 때 유효합니다. 따라서 Y
이 가상이 아닌베이스 (가능하면 CV 규정 및 X
자체에 대한 포인터 포함)에 대한 포인터 인 경우 캐스트는 유효 및이 성공합니다.
또한 다형성 유형 (즉, 가상 함수가있는 클래스)에서 동적 캐스트의 다른 유효한 용도가 있습니다. X
이 다형성 인 경우 Y
은 void *
일 수 있으며 Y
은 X
의 상속 계층 구조의 다른 클래스에 대한 포인터 일 수 있습니다. 그러나 캐스트는 이이면 Y
이베이스에 대한 포인터 인 경우에만 사용됩니다 (그러나이베이스는 가상 일 수 있습니다).
Y는 X의 기본 클래스에 대한 포인터 여야합니다. –
@ ÖöTiib : 예, 그렇습니다. 감사! –
그건 사실이 아니야. 'Y'가'X'의 기본 클래스에 대한 포인터 인 경우'X'는 다형성 일 필요는 없습니다. 그리고 만약'Y'가'void *'이면 캐스트는 성공할 것입니다 (그러나'X'가 다형성 인 경우에만 유효합니다). –
첫째,에 유효하면 Y
은 포인터 유형이어야합니다. 그러면 은 dynamic_cast<Y cv_qualifiers*>(new X)
으로 질문을 다시 작성합시다. X
완전한 클래스 타입이며, 하나 X
경우 다형성 유형, 또는 Y
가 X
와 동일한 유형 또는 X
의 기본 클래스의 경우이 작업을 수행하는 데, 그것은 법률입니다.
Y
가 X
와 동일 또는 X
의 기본 클래스입니다 경우이 성공합니다. 이러한 경우에, dynamic_cast
가 static_cast
같은 동작을 가지고 있으며, 하나는 일반적으로 그냥 캐스트없이 new X
, 를 작성합니다 그래서 사실에서, 암시 적 변환에 해당합니다. (거기에 void*
매개 변수에 결과를 전달할 때 캐스트 는 일반적으로 필요할 수 있습니다 몇 가지 특별한 경우가 그러한 경우에, 나는 static_cast
을 선호한다.하지만, 두 가지의 의미가 바로이 경우에 동일합니다.)
마지막)도 성공할 것이다 (한 특별한 경우가있다 : X
이 다형성 타입이며, Y
는 void cv_qualifiers *
경우. 이 경우, dynamic_cast
는은 static_cast
상이한 의미를 가질 않는 X*
의 유형을 가장 파생 형 ”, 동일한 (그리고 다시 동일하다 실제 효과 “ 포인터를 가질 것이다 new X
로부터 돌려 보낸 있지만 암시 적으로 변환).
가상베이스에서는 정적 캐스트가 작동하지 않습니다! –
@KerrekSB 좋은 지적. 그것은'dynamic_cast'가 필요한 또 다른 경우입니다. –
나는'Y'도 참조 형이 될 수 있다고 생각합니다. 내가 잘못? –
어떻게해야할까요? –
''Y''와''X'의 어떤 타입의 조합이이 코드를 합법적으로 만들고'Y'와'X'의 어떤 타입의 조합이 성공할 것 같 냐고 묻습니다. 예를 들어'Y'가'X'의 기본 클래스이고 가상 소멸자를 가지고 있다면 ... –