dynamic_cast — dynamic_cast

dynamic_cast — dynamic_cast

dynamic_cast는 다형적 타입(가상 함수를 가진 클래스)의 계층 구조에서 런타임에 안전하게 형 변환을 수행하는 연산자예요. 기반 클래스 포인터/참조를 파생 클래스로 안전하게 다운캐스트할 때 사용해요.

static_cast의 다운캐스트는 런타임 검사 없이 위험한 반면, dynamic_cast는 객체의 실제 타입을 확인해서 안전한지 검사해요. 다형적 클래스에만 쓸 수 있어요.

출처: cppreference

본문

dynamic_cast는 다형적 타입의 런타임 안전 형 변환 연산자예요.

문법 (Syntax)

dynamic_cast< new-type >( expression )
  • new-type — 포인터(T*) 또는 참조(T&, T&&) 타입
  • expression — 변환할 표현식

다형적 타입이란 가상 함수(또는 가상 소멸자)를 가진 클래스를 말해요.

설명 (Explanation)

dynamic_cast는 포인터/참조에 대해 다음을 수행해요.

  • 다운캐스트 — 기반 클래스에서 파생 클래스로. 표현식이 가리키는 실제 객체가 목표 타입(또는 그 파생)이면 성공하고, 아니면 포인터는 nullptr, 참조는 std::bad_cast 예외를 반환해요.
  • 업캐스트 — 파생 클래스에서 기반 클래스로 (암시적 변환과 동일)
  • 크로스캐스트 — 같은 계층의 한 기반에서 다른 형제 기반으로

포인터에 대해:

struct Base { virtual ~Base() {} };
struct Derived : Base {};

Base* b = new Derived;
Derived* d = dynamic_cast<Derived*>(b); // OK: b 는 실제로 Derived
if (d) { /* 사용 */ }

Base* b2 = new Base;
Derived* d2 = dynamic_cast<Derived*>(b2); // d2 == nullptr (실패)

참조에 대해:

try {
    Derived& d = dynamic_cast<Derived&>(*b2); // bad_cast 예외
} catch (const std::bad_cast&) { }

RTTI와의 관계

dynamic_cast는 RTTI(run-time type information)에 의존해요. 일부 컴파일러에서 RTTI를 끄면(-fno-rtti) dynamic_cast를 사용할 수 없어요.

typeid와 함께 다형적 타입의 런타임 타입 식별에 사용돼요.

더 알아보기 (Learn more)

cppreference