정체불명의 모모
[c++] dynamic_cast 란? 본문
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++)' 카테고리의 다른 글
[c++]static_cast 란? (0) | 2021.09.08 |
---|---|
[이론] 업캐스팅과 다운캐스팅이란??(필요성, 예제) (0) | 2021.09.08 |
[C++] 상속 관계에서 생성자, 소멸자 호출 순서 / virtual 소멸자 (0) | 2021.08.11 |
[C++/STL] vector와 deque의 차이점 (0) | 2021.08.10 |
[ C++] std::mutex를 통한 thread 동기화 (0) | 2021.08.05 |
Comments