2020 이전/이것저것

RTTI(Run-Time Type Information)

이상해C++ 2018. 11. 3. 23:37

C++ 표준 라이브러리 : https://www.ibm.com/support/knowledgecenter/en/SSPSQF_9.0.0/com.ibm.xlcpp111.aix.doc/standlib/header_files.html


항상 모든 개념들은 사전적인 의미, 키워드 예시, 경험으로 설명할 수 있어야한다.


RTTI는 런타임 타입 인포메이션의 약자로 프로그램 실행 중에 객체의 type이 결정될 수 있도록 하는 메커니즘이며 적어도 한개의 virtual function을 가지고있는 클래스에서만 유효합니다. RTTI에는 세 가지 C++ 언어 요소가 있습니다. dynamic_cast 연산자, typeid 연산자, type_info 클래스가 바로 그것입니다.


Dynamic cast는 클래스 hierarchy에서 파생클래스로의 안전한 down casting 하는데 사용 됩니다.. static_cast와는 달리 대상은 클래스의 포인터나 참조여야하며 static_cast와 달리 타입 안전검사는 런타임 때 수행됩니다.


#include 
using namespace std; 
class B { }; 
class D: public B {}; 
  
int main() 
{ 
    B *b = new D; 
    D *d = dynamic_cast(b); 
    if(d != NULL) 
        cout<<"works"; 
    else
        cout<<"cannot cast B* to D*"; 
    getchar(); 
    return 0; 
}

B클래스 객체의 포인터를 파생 클래스인 D클래스 객체의 포인터로 casting 하기위해 dynamic_cast를 사용할 때, 위와 같은경우 base class인 B에는 가상함수가 없으므로 is not polymorphic 에러를 띄우게 됩니다. 위와 같은 문제를 고치기 위해 D에서 특정 함수를 virtual 로 선언하면 해당하는 오류는 사라집니다.  


typeid는 런타임시 객체의 클래스를 선택하는데 사용됩니다. return 결과는 const type_info& 며 다형 클래스 형식의 l-value에 적용될 때 런타임 검사를 하지 않습니다. 

#include   
#include   
  
class Base {  
public:  
   virtual void vvfunc() {}  
};  
  
class Derived : public Base {};  
  
using namespace std;  
int main() {  
   Derived* pd = new Derived;  
   Base* pb = pd;  
   cout << typeid( pb ).name() << endl;   //prints "class Base *"  
   cout << typeid( *pb ).name() << endl;   //prints "class Derived"  
   cout << typeid( pd ).name() << endl;   //prints "class Derived *"  
   cout << typeid( *pd ).name() << endl;   //prints "class Derived"  
   delete pd;  
}


참고

긱스 포 긱스 : https://www.geeksforgeeks.org/g-fact-33/

위키 독스: https://wikidocs.net/427

MSDN

'2020 이전 > 이것저것' 카테고리의 다른 글

드로우 콜과 텍스처 아틀라스와 배치와 인스턴싱  (0) 2018.11.08
xml & json  (0) 2018.11.05
Singleton  (0) 2018.11.04
Coroutine  (0) 2018.11.03
Google C++ Style Guide  (0) 2018.11.03