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)을 제거하는 변환이 아니면 다음과 같아요.

    1. expression의 타입이 정확히 target-type이거나 그보다 덜 cv-한정된 버전이면, 결과는 타입 target-typeexpression 값이에요. 즉 dynamic_cast로 const를 추가할 수 있어요. 암시적 변환이나 static_cast도 이 변환을 수행할 수 있어요.
    1. target-type이 "(cv-한정된) Base에 대한 포인터"이고 expression의 타입이 "(cv-한정된) Derived에 대한 포인터"이며 BaseDerived의 기반 클래스일 때, 결과는 다음과 같아요.
    • expression이 널 포인터 값이면 널 포인터 값.
    • 그렇지 않으면 expression이 가리키는 Derived 객체의 유일한 Base 하위 객체(suobject)에 대한 포인터. 즉 dynamic_cast는 업캐스팅에서도 쓰일 수 있어요.

실행 시간 타입 확인이 필요한 다운캐스트 등은 다형적 타입(가상 함수가 있는 타입)에서만 가능해요. 대상이 실제 객체와 맞지 않으면 포인터 캐스트는 널을, 참조 캐스트는 std::bad_cast 예외를 던져요.

더 알아보기 (Learn more)

cppreference