티스토리 뷰
상속한 클래스를 넘겨 줬을 때 해당 클래스의 자료형이 뭔지 정확히 알기 위해 사용한다.
컴파일 시에 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를 써야만 할 때가 생기기 때문에..
'Language > C C++' 카테고리의 다른 글
[C++] 2차원 배열의 포인터. 배열은 포인터 상수다. (5) | 2011.03.24 |
---|---|
[C++] Double Pointer에 관하여. 동적 배열에 관하여. (1) | 2011.03.17 |
[C++] class를 주고 받을땐 레퍼런스를 사용하자. (0) | 2011.01.28 |
[C++] 분기문을 싫어하는 나같은 사람에겐.. (0) | 2010.11.30 |
[C++] dynamic_cast, const_cast, reinterpret_cast, static_cast (2) | 2010.11.24 |
[C++] 멤버 변수에서 생성자를 가진 변수 만들기 (0) | 2010.10.06 |
[C++] Algorithm 헤더를 이용한 정렬 (0) | 2010.09.07 |
C++ Vector와 List의 사용 (0) | 2010.09.07 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
TAG
- Troubleshooting
- linux
- C
- Quiz
- 프로그래밍
- 리눅스
- db
- android
- driver
- 음악
- source
- winapi
- 안드로이드
- Python
- gcc
- MFC
- 드라이버
- database
- it
- AWS
- Visual C++
- NDK
- kering
- jni
- algorithm
- API
- C++
- jni강좌
- Cloud
- java
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | 31 |
글 보관함