|
가상함수가 있는 클래스에 대해서 한 가지만 말씀드릴게요.
포인터나 참조가 가리키는 최종 객체의 형이 기초클래스인지 파생클래스인지 컴파일 타임에 알아내기가 너무 복잡하거나 불가능한 경우가 있어요.
예를 들어, 함수 인자로 넘어온 경우나 조건문 등에 따라 대입한 후 조건 블럭을 벗어나면 그렇게 되지요.
그런 경우에는, 실행시간에 실시간으로 최종 객체의 형을 판단한 후 그에 맞는 함수를 호출하거나 해야 해요.
따라서, RTTI가 필요하죠.
질문 님이 쓰신 글 :
: RTTI에 대해 공부를 하였습니다
: RTTI가 실행중에 객체의 정보를 얻는 것을 말하는것 같은데
: 근데 이해가 안되는게 몇가지 있습니다
:
: 1. 왜 RTTI가 필요한가??
: -> 다형성 (같은 이름 다름 기능) 즉 virtual와 같은 가상함수를 자식 클래스에서 각각 재정의했을경우
: 그리고 부모 클래스에 자식클래스를 할당 했을 경우
: 즉) MainClass* main = new chaildClass; 이런식으로 선언을 했을 경우 RTTI를 사용해서 main이
: chaildClass의 객체라는 것을 알려주는 것인데...이게 왜 굳이 필요한건가요??
: 애초에 정의를 할 때 자식 클래스를 할당을 했는데 굳이 이것이 내가 맞게 자식 클래스를 할당했을지
: 단순히 확인을 위해 사용된다는데(인터넷 찾아보니 RTTI설명한 것중에 나와있었음) 단순히 이 이유만은 아닐 것
: 같아서요...
: 그런데 MFC 속성 창을 보니 런타임 형식 정보 사용을 예라고 설정되어 있더라구요 즉 이말은
: MFC에서는 RTTI를 사용하겠다는 소리이고.. RTTI를 사용하는 곳이 BEGIN_MESSAGE_MAP, END_MESSAGE_MAP 뭐
: 이런 define문에서 사용되는것 같은데 맞나요?? (RTTI 예제 중 define처리해서 표현한게 있길래 추측입니다)
: 그렇다면 왜 MFC에서는 RTTI를 어떤 경우에 왜 사용을 하는것인지 궁금합니다...
: 사용방법이나 예제 같은건 쉽게 구해서 공부를 했는데 정작 이것이 왜 필요한지 왜 사용되는지는 잘 설명이
: 되어 있질 않더라구요...
: 2. RTTI는 가상테이블에만 존재한다??
: -> 가상함수를 사용하는 클래스에 국한되어 사용되도록 되어 있으니 가상함수테이블에 RTTI가 저장되는건
: 이해가 갑니다 그런데 이 RTTI를 어떤식으로 호출하게되는건가요??
:
:
: 가상함수를 정의되어 있는 클래스를 b라고 객체선언을 했을 경우 메모리상에 가상테이블을
: 가리키는 포인터 값을 가지고 있고 이 포인터 값을 따라가면 가상함수테이블 해당 클래스가 가지고 있는
: 가상함수의 주소를 배열처럼 쭉 가지고 있는데 그럼 RTTI는 가상함수 주소값 처럼 RTTI주소값(?)이 가상함수
: 테이블에 나타나 있는건가요?? RTTI가 가상함수 테이블에 어떤 형태로 저장되어 있는지 궁금합니다...
: 3. 용어 정리
: -> RTTI가 실행중에 객체의 정보를 얻는 것을 말하는것이라는데 RTTI 자체가 어떤 건가요?
: 클래스 타입인건가요?? 아니면 그냥 용어인가요?? 아니면 객체(?)인가요??
: RTTI라는 새로운 개념에 대해 이것저것 알아가고 있는데 위의 질문에 대한 답은 잘 없네요...
: 3번 질문에 대해서 어떤 분이 언어의 기능, 혹은 컴파일러의 기능을 칭하는 명칭이라고도 하는데...이게 무슨뜻인지
: 이해가가질 안아서 같이 문의드립니다...
|