RTTI(Run-Time Type Information)
그냥 갑자기 급 생각나서 정리해봅니다.
(처음 게임회사 기술면접에서 나왔던 용어인데 뭔지 몰라서 당황했던....)
RTTI : Run-time type information
예제를 보면서 설명하겠습니다.(위키에서 퍼온것에 약간 수정)
#include <iostream>
class Base
{
public:
Base() { }
virtual ~Base() { }
virtual void hello()
{
std::cout << "in Base";
}
};
class Derived : public Base
{
public:
void hello()
{
std::cout << "in Derived";
}
void Bye()
{
std::cout << "out Derived";
}
};
int _tmain(int argc, _TCHAR* argv[])
{
// 부모객체에 자식클래스 동적할당
Base* basePointer = new Derived();
//To find whether basePointer is pointing to Derived type of object
Derived* derivedPointer = dynamic_cast<Derived*>(basePointer);
// 다이나믹 캐스트가 성공했다면
if (derivedPointer != nullptr)
{
std::cout << "basePointer is pointing to a Derived class object"; //Identified
}
// 다이나믹 캐스트가 실패했다면(derivedPointer 객체에 널값이 들어감.)
else
{
std::cout << "basePointer is NOT pointing to a Derived class object";
}
//Requires virtual destructor
delete basePointer;
basePointer = nullptr;
return 0;
}
간단히 주석달아봤는데 설명이 부족하네요;; RTTI의 주사용목적은 부모객체로 자식클래스의 함수를 호출하고자 할때 유용합니다. 다이나믹 캐스트를 통해 만약 basePointer객체에 Derived 객체가 있다면 하향형변환을 통해 Derived객체를 리턴하게되고 만약 Derived 객체가 없다면 NULL 값을 리턴하게 되므로 널값체크만 하면 됩니다. 더 풀어서 이야기하자면 다이나믹캐스트를 했을때 형변환하려는 객체 basePointer가 자식클래스로 Derived 클래스를 가지고 있다면 Derived를 리턴 그렇지 않다면 NULL값을 리턴하게 되는것입닌다. 위의 방법이 아닌 RTTI를 사용하지 않는 경우 부모클래스에 virtual 함수를 통해 자식클래스의 함수를 호출 하는 방법이 있긴합니다.
예) class Base virtual void hello() // 아래와 같이 Derived 함수에 있던 Bye() 함수를 부모클래스에 가상함수로 정의 virtual void Bye(){}
{
public:
Base() { }
virtual ~Base() { }
{
std::cout << "in Base";
}
};
위와 같은 방법은 부모클래스에는 범용적으로 자식들이 사용할 함수를 정의한다는 암묵적인 룰을 깨는 행위므로 그다지 좋지 못한 소스입니다.
자식클래스에서 필요한 함수를 부모클래스에 마구잡이로 정의해 버리면 상속을 안쓰는것만 못한 현상이....
부랴부랴 급하게 정리한거라 이해가 잘 될지 모르겠네요...;;
RTTI를 무분별하게 사용할 경우(하나의 함수안에서 다른 자식클래스로 여러번 캐스팅이 이루어질경우) 현재 부모객체가 어떤 자식클래스로 캐스팅되어있는지 모르게 될 경우가 있습니다.
아.. 한가지더 !!
참고로 RTTI를 쓰기위해선 꼭 부모클래스에 최소한 virtual 함수가 하나 이상은 있어야합니다.
그이유는 추후 virtual 함수의 원리에서 설명하는걸로...!!
뭐든지 적절히 적당히 쓰는게 좋습니다 ㅋ