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가 출력된다.