RTTI는 Run-Time Type Information의 약어로, 프로그램의 실행 시 데이터형의 타입을 확인하고자
할 때와 클래스의 포인터가 내가 사용하고자 하는 포인터형과 일치하는지 검사 시 사용한다.
RTTI는 3가지로 구성되며, 다음과 같다.
. dynamic_cast
. typeid
. type_info
typeid 연산자는 클래스의 정보를 출력하거나 비교할 수 있으며, typeid 연산자가 리턴하는
type_info의 구조체는 아래와 같이 선언되어 있다.
class type_info
{
public:
_CRTIMP virtual ~type_info();
_CRTIMP int operator == (const type_info& rhs) const;
_CRTIMP int operator != (const type_info& rhs) const;
_CRTIMP int before(const type_info& rhs) const;
_CRTIMP const char* name() const;
_CRTIMP const char* raw_name() const;
private:
void *_m_data;
char _m_d_name[1];
type_info(const type_info& rhs);
type_info& operator=(const type_info& rhs);
};
이를 사용하여 간단한 예를 짜보면,
#include <stdio.h>
#include <typeinfo> // type_info의 구조체
class T1
{
public:
void test() {}
};
void main()
{
T1 t;
printf( "%s \n", typeid(t).name() );
}
출력 결과는
class T1
이다. 만약 클래스가 T1 t2; 처럼 정의되었다면 typeid 연산자를 사용해서
if( typeid(t) == typeid(t2) )
처럼 비교할 수 있다.
---------------------------------*^^*--------------------------------
그리고 dynamic_cast는 다음과 같은 경우에 사용한다.
다음 예를 잘 살펴보면 T1의 포인터인 t가 t1객체를 가리킬때, ((T2*)t)->print2(); 를 호출하고 있다.
이 것은 t가 t1 객체를 가리키는 포인터이므로 print2() 함수를 호출될 수 없는데, 호출하기 때문에
심각한 오류를 발생시킨다. 심각한 오류의 원인은 T1 객체가 생성되었을 때는 가상함수 테이블에
print1()에 대한 함수 포인터까지만 있고 두번째는 없기 때문이다. 당연히 T2 객체가 생성된 가상함수
테이블이라면, print1(), print2()가 순서대로 있을 것이다. 다음은 예제이다.
dynamic_cast는 현재 객체가 다른 형으로 캐스팅이 가능하면 NULL이 아닌 값을, 가능하지 않으면
NULL 값이 반환된다.
// RTTI.cpp
#include <stdio.h>
#include <typeinfo>
class T1
{
public:
virtual void print1() { puts( "t1p1" ); }
};
class T2 : public T1
{
public:
virtual void print1() { puts( "t2p1" ); }
virtual void print2() { puts( "t2p2" ); }
};
void main()
{
T1 *t1 = new T1;
T2 *t2 = new T2;
T1 *t;
t = t1;
t->print1();
t = t2;
t->print1();
((T2*)t)->print2();
t = t1;
t->print1();
//((T2*)t)->print2(); // 프로그램 다운
t = dynamic_cast<T2*>(t1);
if( t )
{
((T2*)t)->print2();
}
}
출저 : http://cafe.naver.com/pplus/144
'[ Programing ] > C++' 카테고리의 다른 글
템플릿 클래스(Template Class)에서 멤버 로 iterator 가지기 (0) | 2013.05.22 |
---|---|
[코딩 팁]조건문에서 상수를 앞에 두기 (0) | 2013.05.22 |
CPU 갯수 알아오기 (0) | 2013.05.21 |
클래스 내부에 함수 포인터 쓰기 (0) | 2013.05.21 |
PSAPI Library 를 이용한 현재 프로세스 메모리 사용량 파악 (0) | 2013.05.21 |