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와 함께 다형적 타입의 런타임 타입 식별에 사용돼요.