정체불명의 모모

[c++] dynamic_cast 란? 본문

프로그래밍(c++)

[c++] dynamic_cast 란?

정체불명의 모모 2021. 9. 8. 14:41

 

dynamic_cast란?

: class의 상속관계에서 형변환을 프로그래머가 올바르게 하도록 도와주는 기능을 제공해주는 녀석이다.

  dynamic_cast 는 RTTI(Run Time Type Information)을 지원한다. ← 그래서 비용이 비싸다.

  RTTI는 런타인에서 클래스의 type_info를 보고 해당 클래스가 올바른 type의 형태인지 아닌지 판단하게 해줍니다.

   

   dynamic_cast는 상속 관계 안에서 포인터나 참조자의 타입을 기본 클래스에서 파생 클래스로의 다운 캐스팅과 다중 상속에서

   기본 클래스간의 안전한 타입 캐스팅에 사용된다.

 

  • 부모 클래스에 virtual 함수가 없는 경우
    : 자식클래스에서 부모클래스로만 변환이 가능하며,
      (자식 클래스에서 부모 클래스로 변환하기 위해서는 부모클래스를 public 상속 받아야 합니다.)
  • 부모클래스에 virtual  함수가 있는 경우
    : 부모클래스에서 자식클래스로 형변환 하는 것 까지 가능하되,
      런타임 중에 부모클래스 포인터에서 자식클래스 포인터로 형변환이 실패하는 경우 nullptr을 반환 합니다.

  dynamic_cast 사용하는 제약 사항
  • 상속 관계 안에서만 사용할 수 있다.
  • 하나 이상의 가상함수를 가지고 있어야 한다.
  • 컴파일러의 RTTI 설정이 켜져 있어야 한다.

사용 방법
dynamic_cast<변환형>(변환할 내용)

※ 변환형은 완전한 클래스(비추상 클래스)의 포인터 또는 참조 이거나 void*여야 합니다.


dynamic_cast 예제

: Runtime에 클래스들의 타입에 맞게 downcast 된 것을 확인할 수 있습니다.

class Animal
{
    public:
    	virtual void sound() = 0;
        
        void info()
        {
        	std::cout << "동물은 숨을 쉽니다." << std::endl;
        }
};

class Dog: public Animal
{
    private:
    	std::string name;
        
    public:
    Dog(std::string s) : name(s){};
    
    void sound() {std::cout << "멍멍!" << std::endl;}
    void name_print() {std::cout << name << std::endl;}
    void only_dog() {std::cout << "이건 강아지 클래스" << std::endl;}
};

class Cat : public Animal
{
    private:
    	std::string name;
        
    public:
    	Cat(std::string s) : name(s) {};
        
        void sound() {std::cout << "냐옹~" << std::endl;}
        void name_print() {std::cout << name << std::endl;}
        void data() {std::cout << this << std::endl;}
        void only_cat() {std::cout << "이건 고양이 클래스" << std::endl;}
 };
 
 int main()
 {
    std::vector<Animal*> v;
    
    v.emplace_back(new Cat("나비"));
    v.emplace_back(new Dog("멍멍이"));
    
    Cat* cat;
    Dog* dog;
    
    for(int i = 0 ; i < v.size() ; i++)
    {
    	if(cat = dynamic_cast<Cat*>(v[i]))
        {
            cat->name_print();
            cat->sound();
            cat->only_cat();
        }
        else if(dog = dynamic_cast<Dog*>(v[i]))
        {
            dog->name_print();
            dog->sound();
            dog->only_dog();
         }
     }
     
   delete cat;
   delete dog;
   
   return 0;
  }

위 코드 출력 결과


참고 사이트 

https://hwan-shell.tistory.com/213

 

C++] dynamic_cast에 대해서...

모든 언어에는 형변환이 있습니다. C++에선 다양한 형번환 객체들을 제공합니다. 1. static_cast = https://hwan-shell.tistory.com/211 2. dynamic_cast 3. const_cast = https://hwan-shell.tistory.com/215 4..

hwan-shell.tistory.com

https://prostars.net/55

 

C++ 이야기 - [2] 캐스트 연산자 dynamic_cast

C++의 4가지 캐스트 연산자에 대한 이야기 중 두 번째다. 이번은 그중에서 dynamic_cast 에 대해서 이야기한다. dynamic_cast 는 상속 관계 안에서 포인터나 참조자의 타입을 기본 클래스에서 파생 클래

prostars.net

 

Comments