language_dynamic_cast
language_dynamic_cast (dynamic_cast 캐스팅)
상속 계층을 따라 위·아래·옆으로 클래스에 대한 포인터와 참조를 안전하게 변환해요. 주로 가상 상속·다형적 타입에서 실행 시간에 타입을 확인하며 캐스팅해요.
출처: cppreference
본문
문법
dynamic_cast< target-type >( expression )
target-type: 완전 클래스 타입에 대한 포인터, 완전 클래스 타입에 대한 참조, 또는 (cv-한정된)void에 대한 포인터.expression:target-type이 참조면 완전 클래스 타입의 lvalue(C++11 이전)/glvalue(C++11),target-type이 포인터면 완전 클래스 타입에 대한 포인터의 prvalue.
설명
설명의 편의를 위해 "표현식 또는 결과가 T에 대한 참조"는 "T 타입의 glvalue"를 뜻한다고 해요. 이는 decltype의 관례를 따르는 거예요. (C++11)
dynamic_cast로 할 수 있는 변환은, const(또는 volatile)을 제거하는 변환이 아니면 다음과 같아요.
-
expression의 타입이 정확히target-type이거나 그보다 덜 cv-한정된 버전이면, 결과는 타입target-type의expression값이에요. 즉dynamic_cast로 const를 추가할 수 있어요. 암시적 변환이나static_cast도 이 변환을 수행할 수 있어요.
-
target-type이 "(cv-한정된) Base에 대한 포인터"이고expression의 타입이 "(cv-한정된) Derived에 대한 포인터"이며Base가Derived의 기반 클래스일 때, 결과는 다음과 같아요.
expression이 널 포인터 값이면 널 포인터 값.- 그렇지 않으면
expression이 가리키는Derived객체의 유일한Base하위 객체(suobject)에 대한 포인터. 즉dynamic_cast는 업캐스팅에서도 쓰일 수 있어요.
실행 시간 타입 확인이 필요한 다운캐스트 등은 다형적 타입(가상 함수가 있는 타입)에서만 가능해요. 대상이 실제 객체와 맞지 않으면 포인터 캐스트는 널을, 참조 캐스트는 std::bad_cast 예외를 던져요.