Dynamic_cast 글을 읽기 전 가상 함수, 가상 함수 테이블 게시물을 읽으면 더욱 이해하기 편합니다. https://shung2.tistory.com/584
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합니다.
'공부 > C++' 카테고리의 다른 글
스마트 포인터와 스마트 포인터의 종류 (0) | 2023.01.06 |
---|---|
Static과 extern의 개념 및 차이 (0) | 2022.12.29 |
가상 함수(Virtual Function)와 가상 함수 테이블(Virtual Function Table) 개념 및 차이 (0) | 2022.12.22 |
Vector resize, reserve의 차이점 (0) | 2022.12.21 |
포인터(Pointer)와 참조자(Reference)의 차이 (1) | 2022.12.20 |