JHB의 프로그래밍 삽질기

[C++] RTTI와 vtable 그리고 RTCI 본문

PROGRAMMING/C C++ MFC

[C++] RTTI와 vtable 그리고 RTCI

roter 2010.11.25 15:37
상속한 클래스를 넘겨 줬을 때 해당 클래스의 자료형이 뭔지 정확히 알기 위해 사용한다.

컴파일 시에 RTTI를 사용하여 컴파일 하면 vtable을 사용 할 수 있다.

vtable은 가상 함수 테이블인데 아래의 소스를 함 보자.

class Parent{
public:
 virtual void func(Parent obj);
};
class Child : public Parent{
public:
 virtual void func(Parent obj);
};

이런 클래스가 있을 때
Parent p;
Child c;
p.func(p);
p.func(c);

이렇게 하면 함수 func에서는 인자로 들어온 Parent obj에 대하여 이것이 Child인지 Parent 인지 알 길이 없다.
자바에서는 걍 p.getClass ==  Parent.class하면 되는데 C++에선 이걸 RTTI를 사용해서 알아내야 한다.
(RTTI는 C++ 표준 스펙임. gcc에선 gcc -rtti 해주면 되고 mfc에서는 빌드옵션 가면 있다.)

RTTI를 키고 컴파일 하면 각 클래스 별로 vtable을 갖게 된다.
이를 알아 내는 것은 typeid(Object obj); 인데, type_info를 리턴한다.
Parent p;
typeid(obj) == typeid(p); 로 어떤 클래스 인지 알아 낼 수 있다.
typeid(obj).name(); 하면 클래스 이름도 나온다.

RTCI
MFC에서는 RTTI말고 RTCI(Runtime Class Information)라고해서 헤더에는 DECLARE_DYNAMIC(className), 바디에는 IMPLEMENT_DYNAMIC(className, baseClassName) 매크로를 쓰는 방법이 있다. MS에서 CObject 아래 있는 놈들한테 쓰라고 만들어 준거다.
IsKindOf라는 함수를 제공하며 사용은 이렇게 한다.
obj->IsKindOf( RUNTIME_CLASS( CParent ) ) 


p.s) rtti를 쓰게 되는 경우 흔히 '잘못된 설계'라고 한다.
하지만 현실은 그리 녹록치 않다.. 이미 설계 다 하고 구현 다 했는데 요구 사항이 바뀌면 rtti를 써야만 할 때가 생기기 때문에..


Tag
,
0 Comments
댓글쓰기 폼