본문 바로가기
프로그래밍 언어/C++

[C++] RTTI (Run-Time Type Information)

by 까망 하르방 2025. 2. 28.
반응형

RTTI (Run-Time Type Information)

• 실행시간에 객체 타입 조사
• 특정 조건에서는 컴파일 시간에도 조사 가능

 

 

타입 조사

• typeid 연산자

• dynamic_cast

 

 

typeid

객체 타입 정보를 std::type_info 타입의 객체 참조 반환

const, volatile, refernece 제외한 타입에 결과 반환

• t1 = t2

• t1.hash_code() == t2.hash_code()

• std::type_index(t1) == std::type_index(t2)

#include <iostream>
#include <typeinfo>

int main()
{
    auto n = 10;

    const std::type_info& t1 = typeid(n);
    const std::type_info& t2 = typeid(3 + 4.1);

    std::cout << "t1 = " << t1.name() << std::endl; // int
    std::cout << "t2 = " << t2.name() << std::endl; // double
}



가상함수 있는 경우 vs 가상 함수 없는 경우

• 가상함수가 있는 경우 실행시간에 가리키는 메모리 조사해서 결정
• 가상함수 없는 경우 컴파일 시간에 타입 결정

 

 

[예제] 가상함수 있는 경우

#include <iostream>
#include <typeinfo>

class Animal
{
public:
    virtual ~Animal() {} // 가상함수
};

class Dog : public Animal {};

int main()
{
    Animal* p = new Dog;

    std::cout << typeid(p).name() << std::endl; // Animal
    std::cout << typeid(*p).name() << std::endl; // ??? --> Dog

    delete p;
}

 



[예제] 가상함수 없는 경우

#include <iostream>
#include <typeinfo>

class Animal
{
public:
    ~Animal() {} // 가상 함수 X
};

class Dog : public Animal {};

int main()
{
    Animal* p = new Dog;

    std::cout << typeid(p).name() << std::endl; // Animal
    std::cout << typeid(*p).name() << std::endl; // ??? --> Animal

    delete p;
}

 



[예제] const, reference 제외

#include <iostream>
#include <typeinfo>

int main()
{
    const std::type_info& t1 = typeid(int);
    const std::type_info& t2 = typeid(int&);
    const std::type_info& t3 = typeid(const int&);
    const std::type_info& t4 = typeid(int*);
    
    std::cout << (t1 == t2) << std::endl; // true
    std::cout << (t1 == t3) << std::endl; // true
    std::cout << (t1 == t4) << std::endl; // false
}

 


📌 [C++] 가상 함수 (virtual funciton)

 

[C++] 가상 함수 (virtual funciton)

가상 멤버 함수 (virtual function)동적 바인딩을 위해 사용class A{public: virtual void sub(void);};  [예제] 함수 재정의(overriding) 주의사항#include class Animal{public: void Cry() { std::cout Cry(); // ??? -> Dog? Animal?}Q) p-

zoosso.tistory.com

반응형

댓글