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와 달리 타입 안전검사는 런타임 때 수행됩니다.
#includeusing 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 |