본문 바로가기

C++

dynamic_cast

dynamic_cast는 C++에서 다형성을 지원하는 타입 안전한 형변환 연산자로, 주로 런타임 타입 확인(RTTI, Run-Time Type Information)을 통해 기본 클래스 포인터나 참조를 파생 클래스의 포인터나 참조로 변환할 때 사용됩니다. dynamic_cast는 형변환이 올바른지 여부를 런타임에 검사하고, 올바르지 않다면 안전하게 변환 실패를 처리합니다.

 

dynamic_cast의 주요 특징

  1. RTTI를 사용한 타입 안전성:
    • dynamic_cast는 런타임에 객체의 실제 타입을 확인하여 형변환이 안전한지 검증합니다. 만약 형변환이 안전하지 않다면, nullptr을 반환하거나 std::bad_cast 예외를 던집니다.
  2. 다형성(Polymorphism) 지원:
    • dynamic_cast는 다형성 클래스(즉, 가상 함수가 정의된 클래스)에서만 사용할 수 있습니다. 기본 클래스가 가상 함수를 가지고 있어야 하며, 이를 통해 파생 클래스에서 올바르게 동작할 수 있습니다.
  3. 안전한 다운캐스팅(Safe Downcasting):
    • 기본 클래스 포인터를 파생 클래스 포인터로 변환하는 "다운캐스팅"에서 런타임에 안전성을 보장합니다. 잘못된 형변환을 시도하면 안전하게 nullptr을 반환합니다.
  4. 업캐스팅(Upcasting)과 크로스 캐스팅(Cross Casting):
    • 업캐스팅(파생 클래스에서 기본 클래스로 변환)은 컴파일 타임에 안전하므로 dynamic_cast뿐만 아니라 static_cast로도 할 수 있지만, 다중 상속 상황에서 정확한 변환을 위해 dynamic_cast가 필요할 수 있습니다.

dynamic_cast의 동작 원리

dynamic_cast는 런타임에 객체의 타입을 확인하기 위해 객체의 **가상 테이블(vtable)**과 **가상 테이블 포인터(vptr)**를 사용합니다. 이러한 정보는 객체가 생성될 때 설정되며, 가상 함수가 포함된 클래스의 객체가 생성될 때 자동으로 생성됩니다.

  • vptr (가상 테이블 포인터): 각 객체가 가리키는 vtable을 참조하는 포인터입니다.
  • vtable (가상 테이블): 클래스의 가상 함수들에 대한 포인터 리스트를 저장한 테이블입니다. 클래스마다 하나의 vtable이 생성되고, 가상 함수가 호출될 때 이 vtable을 참조하여 호출할 함수를 결정합니다.
Base* basePtr = new Derived();  // basePtr은 Derived 객체를 가리킴

// dynamic_cast를 사용하여 Base 포인터를 Derived 포인터로 변환 시도
Derived* derivedPtr = dynamic_cast<Derived*>(basePtr);

위와 같은 dynamic_cast를 할 때 가상 함수 테이블에 가상 함수의 유무로 형변환 가능한지 판단하게 된다. basePtr을 Derived*로 형변환을 시도하면, basePtr의 가상 함수 테이블에 Derived객체의 가상 함수가 있는지 확인 후 존재하면 형변환 성공 실패시 nullptr을 반환합니다.

 

이렇게 dynamic_cast는 가상 함수 테이블을 활용하여 형변환을 시도하기 때문에 상속 관계속에서도 반드시 1개 이상의 가상 함수를 포함해야 합니다.

'C++' 카테고리의 다른 글

static_cast  (0) 2024.09.05
참조 타입 (Reference)  (0) 2024.07.07
문자 타입  (0) 2024.07.07
부동소수점  (0) 2024.07.03