RTTI (RunTime Type Information 또는 RunTime Type Indentification)
- C++ 컴파일러 내에 포함되어 있는 기능으로서, 객체의 유형을 실행 시에 결정할 수 있도록 허용
- 클래스를 동적으로 생성하고 이에 대한 정보를 얻음
- RTTI 를 구현하기 위해 MS에서 CRuntimeClass를 만듬
http://www.winapi.co.kr/clec/cpp3/33-1-1.htm
* class##classname : ##의 의미는?
http://eslife.tistory.com/entry/define-%EB%A7%A4%ED%81%AC%EB%A1%9C-%ED%8C%81
‘##’ - Token-Pasting Operator (##): 분리되어 있는 2개의 토큰을 하나로 뭉쳐주는 역할을 합니다.
#define paster( n ) printf( "token" #n " = %d", token##n ) |
라고 할 때 아래와 같은 코딩은
int token9 = 9; paster( 9 ); // token##n -> token 과실제인수9 를합쳐token9 가됨 |
CRuntimeClass 사용법
- 동적 클래스는 CObject를 베이스 클래스로 해야 한다.
1. 동적클래스는 CRuntimeClass타입의 static 멤버를 가져야 한다.
2. 선언된 static멤버를 초기화 : 클래스 이름, 크기..
3. 동적클래스는 CObject*를 리턴하는 static CObject* CreateObject()함수를 선언해야 한다.
4. static CreateObject()를 구현 : 클래스의 시작주소를 리턴
- 사용 매크로
DECLARE_DYNAMIC(class_name) : 1번
- 동적 클래스 선언
IMPLEMENT_DYNAMIC(class_name) : 2번
- 생성된 동적 클래스 초기화
- IMPLEMENT_RUNTIMECLASS 호출
DECLARE_DYNCREATE(class_name) : 1번, 3번
- DECLARE_DYNAMIC()을 호출
- 추가적인 정적멤버 함수 CreateObject() 선언
IMPLEMENT_DYNCREATE(class_name) : 2번, 4번
- IMPLEMENT_DYNAMIC()을 호출,CreateObject() 정의
DECLARE_SERIAL
- DECLARE_DYNCREATE() 기능 + 직렬화 기능 제공
- RUNTIME_CLASS(class_name)
동적클래스의 CRuntimeClass* 를 반환
생성자도 호출되기 전에 사용가능한 이유 : 동적클래스가 정적멤버를 가지고 있기 때문
RUNTIME_CLASS(CMyObject)->CreateObject();
의 경우와 new연산자를 사용하여 CMyObject개체를 만드는 것과는 차이가 없음 - DYNAMIC_DOWNCAST, STATIC_DOWNCAST 의 차이
DYNAMIC_DOWNCAST( class, pointer )는 특정 포인터를 원하는 클래스타입의 객체 포인터로 형변환하는 매크로
pFrame = DYNAMIC_DOWNCAST( CMDIFrame-xWnd, AfxGetMainWnd() );
는 pFrame = (CMDIFrame-xWnd*) AfxGetMainWnd(); 와 동일
정상적인 형변환이 이루어지지 않을때 NULL을 반환
http://pdalocal.paran.com/know/know_view.html?que=851267
DYNAMIC_DOWNCAST STATIC_DOWNCAST 똑같은 일을 하는 매크로입니다.
차이점 : DYNAMIC_DOWNCAST debug와 release 모드 모두에서 타입을 체크하지만
STATIC_DOWNCAST debug 모드에서만 타입체크를 한다는 점입니다.
그래서 DYNAMIC_DOWNCAST 타입체크가 실패하면 NULL 값을 리턴하지만
STATIC_DOWNCAST는 ASSERT 일으킵니다.
일반적 경우 STATIC_DOWNCAST을 권장 - dynamic_cast
RTTI 환경에서 자식클래스와 부모 클래스 간의 형변환
http://www.winapi.co.kr/clec/cpp3/33-1-1.htm
http://www.winapi.co.kr/clec/cpp3/33-2-3.htm
http://blog.naver.com/skim01?Redirect=Log&logNo=20014776332
http://kldp.org/node/1181
- 추가 연구 대상 : typeid, static_cast, dynamic_cast, const_cast, reinterpret_cast
'Code' 카테고리의 다른 글
OEP 찾는 방법들 (0) | 2012.08.19 |
---|---|
UNICODE in Console (0) | 2012.08.19 |
pragma 정리 (0) | 2012.08.19 |
Pointer Test (0) | 2012.08.19 |
GNU선언문 (0) | 2012.08.19 |