C++에서 RTTI란 C#에서 리플랙션과 유사하지만 다르다 (기능이 많이 떨어진다)
프로그램 실행 중에 개체의 형식이 결정될 수 있도록 하는 매커니즘이다.
다시 말해서 런타임중에 포인터가 가르키는 객체의 실제 타입을 알 수 있게 해주는 방법이다.
virtual 클래스로 부터 상속이 하나라도 존재하면 RTTI를 사용하고 있다고 생각하면 된다.
C++ 캐스팅 방법중 dynamic_cast은 RTTI에 매우 의존적이다.
예제:
#include<iostream>
using namespace std;
class Car
{
public :
void Open()
{
cout << "차문 개방" << endl;
}
};
class BasicCar : public Car
{
public:
void Open()
{
cout << "옆으로 열림" << endl;
}
};
class SuperCar : public Car
{
public:
void Open()
{
cout << "위로 열림" << endl;
}
};
int main()
{
Car* B = new BasicCar();
Car* S = new SuperCar();
cout << typeid(*B).name() << endl;
cout << typeid(*S).name() << endl;
}
위의 코드는 virtual 함수가 없기 때문에 가상 함수 테이블이 존재 하지 않으므로 RTTI 정보가 없다.
그렇기에 B나 S는 상속받은 BasicCar나 SuperCar로 출력되는게 아니라 class Car라고 출력된다.
#include<iostream>
using namespace std;
class Car
{
public :
virtual void Open()
{
cout << "차문 개방" << endl;
}
};
class BasicCar : public Car
{
public:
void Open()
{
cout << "옆으로 열림" << endl;
}
};
class SuperCar : public Car
{
public:
void Open()
{
cout << "위로 열림" << endl;
}
};
int main()
{
Car* B = new BasicCar();
Car* S = new SuperCar();
cout << typeid(*B).name() << endl;
cout << typeid(*S).name() << endl;
}
하지만 가상함수가 있으면 가상함수 테이블이 생성되므로 가상함수 테이블 안에 RTTI 정보가 존재하기 때문에 Car로 부터 상속받은 BasicCar, SuperCar가 출력된다.