런타임 동안 해당 타입에 대한 정보를 알아보는것
우리가 게임이나 프로그램 실행중에 어떠한 객체의 타입을 알려면 그객체의 고유 ID를 멤버에 넣어서 그 ID를 통해 식별하거나 하는
방법을 사용하는데 RTTI를 사용하면 언제든 클래스 타입이 뭔지 알아낼수 있다.
그리고 다형성 객체의 동적 타입을 알아내기 위해 도입된 기능이다.
RTTI는 다형성 객체의 동적 타입을 알아내기 위해 만들어진 기능. base* 타입의 포인터가 포인팅 하고있는 객체가 실제로 type1 인지 type2 인지
알고자 할 때 쓰이는것.
정리하면..;
A라는 클래스의 객체 a만 가지고선 A라는 클래스의 객체인지 알 수 도없고, 어디서 상속받는 클래스의 객체인지 알수도 없다.
이런 경우 객체의 타입을 알아내기 위해서 RTTI를 사용한다.
RTTI특성상 객체를 생성 할 때마다 그 객체 내부에 타입 정보와 상속 정보를 넣어둔다. 때문에 속도의 저하가 일어난다.
이펙티브c++책에도 켯을때와 껏을때의 속도 차이가 난다는것을 알려준다.
이 안에 있는 장치중에 dynamic_Cast라는 것이 있다
객체가 상위 클래스로 형변황 할때 형변환 안정성을 검사해 주는 연산자.
C형태의 형변환을 사용하여 포인터의 형변환을 사용하면 상속받지 않은 클래스도 형변환이 이루어 진다.
다만 어떤 결과가 나올지는 예상할 수 없는 일이다. 이런경우 dynamic_cast<>를 사용하면 RTTI를 사용해서
타입 확인을 하기 때문에 안전하게 형변환이 가능하다. 다만 dynamic_Cast는 RTTI정보를 사용하기 때문에 속도가 떨어진다.
그래서 변형된 형태의 RTTI를 사용한다. 보통 클래스 내부에 객체의 타입을 하나의 변수에 두고 그 변수를 확인 하는 방법이다.
class A
{
public:
A() { type = TYPE_A; } // type값을 생성자에 넣는다
int GetType(){ return type; } // 객체의 type를 반환한다
protected:
int type; // 객체의 type를 저장하는 변수
};
class B : public A
{
B() { type = TYPE_B; } // 상속받은 클래스 마다 자신의 type를 저장한다
}
B* b = new B();
switch( b->GetType() ) // 객체의 type를 받아와서 작업한다
{
case TYPE_A:
break;
case TYPE_B:
break;
}
이와같이 RTTI는 실행 시점에서 객체만을 가지고 그 객체의 타입(클래스)를 알아내서 작업을 하는 경우에 많이 사용된다.