공부/C++

Dynamic_cast 내부동작은 어떻게 되는가?

셩잇님 2022. 12. 23. 12:43
반응형

 

 

Dynamic_cast 글을 읽기 전 가상 함수, 가상 함수 테이블 게시물을 읽으면 더욱 이해하기 편합니다. https://shung2.tistory.com/584

 

가상 함수와 가상 함수 테이블 개념 및 차이

객체 지향 프로그래밍에서 가상 함수(Virtual Function)는 파생된 클래스에서 재정의할 수 있는 멤버 함수입니다. 기본 클래스와 동일한 구문을 사용하고, 호출되는 동안 파생된 클래스에서 변경되

shung2.tistory.com

 

 


 

 

C++에서 dynamic_cast 연산자는 런타임에 캐스트를 수행하는 데 사용됩니다. 포인터나 참조를 한 유형에서 다른 유형으로 변환하는 데 사용되며, 여기서 대상 유형은 다형성 클래스(최소한 하나의 가상 함수(Virtual Function)가 있는 클래스)입니다.

dynamic_cast 연산자는 런타임 시 객체의 유형을 확인하고 객체 유형이 올바른 경우 캐스트를 수행하여 작동합니다. 만약 객체가 올바른 유형이 아닌 경우 dynamic_cast는 캐스트 유형에 따라 null 포인터를 반환하거나 예외를 throw합니다.

다음은 예제는 dynamic_cast를 사용하여 C++에서 기본 클래스에 대한 포인터를 파생 클래스에 대한 포인터로 캐스팅하는 방법에 대한 예제입니다.

#include <iostream>

class Base
{
public:
    virtual ~Base() {}
};

class Derived : public Base
{
};

int main()
{
    Base* b = new Derived;

    // Use dynamic_cast to cast the pointer to a Derived*
    Derived* d = dynamic_cast<Derived*>(b);
    if (d)
        std::cout << "The cast was successful." << std::endl;
    else
        std::cout << "The cast failed." << std::endl;
}

내부적으로 dynamic_cast는 캐스트되는 개체의 런타임 유형 정보(RTTI)를 확인하여 작동합니다. RTTI는 런타임 시 객체에 대한 유형 정보를 저장하는 데 사용되는 메커니즘이며 가상 함수 테이블(=vtable)이라는 특수 데이터 구조를 사용하여 구현됩니다.

C++의 모든 다형성 클래스에는 클래스의 가상 함수에 대한 포인터 목록이 포함된 가상 함수 테이블(=vtable)이 있습니다. 다형성 클래스의 객체가 생성되면 해당 유형에 해당하는 가상 함수 테이블(=vtable)이 할당됩니다.

dynamic_cast는 객체의 RTTI 및 가상 함수 테이블(=vtable)을 사용하여 런타임 시 해당 유형을 결정하고 그에 따라 캐스트를 수행합니다. 객체 유형이 올바른 경우 dynamic_cast는 객체에 대한 포인터 또는 참조를 반환합니다. 객체가 올바른 유형이 아닌 경우 dynamic_cast는 캐스트 유형에 따라 null 포인터를 반환하거나 예외를 throw합니다.

 

 

 

반응형