- RTTI란?
말그대로 런타임 시점에 클래스나 자료형을 확인하는 것을 말합니다.
RTTI를 통해서 정적인 자료형, 명시적인 자료형만 확인할 수 있는 것이 아니라, 업캐스팅 된 상태의 파생클래스 자료형까지 확인할 수 있습니다.- msdn에서 말하는 C++의 RTTI
msdn에서는 C++이 지원하는 RTTI가 세가지라고 말합니다.
- dynamic_cast 연산자
- typeid 연산자
- type_info 클래스
msdn 런타임 형식 정보 링크
C++에서 지원하는 형변환 연산자 중 하나입니다. 상속관계에 있는 클래스간 형변환을 담당하며, RTTI를 통해 안전한 Down Casting을 보장합니다. 하지만 다른 형변환에 비해서 굉장히 느리다는 단점이 있습니다.
typeid 연산자는 const type_info& 형태로 객체 정보를 반환하는 연산자입니다
클래스 정보를 담는 클래스 입니다. 클래스의 정보를 프로그래머가 사용하기 좋도록 문자열로 변환해주는 기능도 있습니다.
RTTI는 가상함수 테이블을 체크하여 해당 객체의 정보를 확인합니다.
- 가상함수 테이블이 없다면 typeid 연산자를 통해서 typeid를 확인할 때, 정적인 자료형만 확인할 수 있고, 실제 자료형은 확인이 불가능합니다.
- 가상함수 테이블이 없다면 dynamic_cast를 통한 다운캐스팅이 불가능합니다.(컴파일 오류)
#include <typeinfo> //RTTI기능 중 typeid 연산자와 type_info 클래스를 사용하기 위한 헤더
#include <iostream>
class Base
{
public:
virtual ~Base()
{
}
};
class Derived : public Base
{
public:
~Derived() override
{
}
};
int main()
{
Derived* derivedPtr = new Derived();
Base* UpcastPtr = derivedPtr;
Base* BasePtr = new Base();
Derived* DowncastPtr = dynamic_cast<Derived*>(UpcastPtr);
const std::type_info& confirm = typeid(*UpcastPtr); //typeid 연산자는 const type_info& 형태로 객체 정보를 반환
//1. 가상함수 테이블 체크를 통해서 해당 객체의 형을 확인하기 때문에, 가상함수테이블이 없다면 정적인 클래스만 확인 가능(Base로 받았다면 Base로 반환)
//2. 가상함수 테이블이 있다면, Up Casting을 한 상태에서도 실제 자료형을 확인할 수 있음
//3. 가상함수 테이블이 없다면 dynamic cast를 이용한 다운캐스팅은 불가능함(컴파일 오류), 업캐스팅은 됨
if (confirm == typeid(Base)) //type_info의 비교연산자(==, !=)를 이용해 타입 정보를 확인 가능
{
std::cout << confirm.name() << std::endl;
}
if (confirm == typeid(Derived))
{
std::cout << confirm.name() << std::endl;
}
size_t HASHCODE = confirm.hash_code(); //클래스 정보를 해쉬로 반환
std::string Name = confirm.name(); //사람이 읽을 수 있는 형식으로 문자열을 반환합니다
std::string Raw_Name = confirm.raw_name(); // 마이크로소프트 전용 함수라네요, 공간을 절약하기 위해 데코레이팅 된 방식으로 저장된답니다
bool result = typeid(Base).before(confirm); //자료형이 앞서는지 확인(별로 몰라도 되는것 같음)
//앞선다는 개념이 c++에서 정의한 사전식 기준이래요, 컴파일러에 따라서 다를수도 있다고....
//별로 중요하지 않은것같음
delete derivedPtr;
delete BasePtr;
}