C++ Chapter 12.10 : 동적 형변환 dynamic_cast
카테고리: Cpp
태그: Cpp Programming
인프런에 있는 홍정모 교수님의 홍정모의 따라 하며 배우는 C++ 강의를 듣고 정리한 필기입니다. 😀
🌜 [홍정모의 따라 하며 배우는 C++]강의 들으러 가기!
chapter 12. 가상 함수들 : 동적 형변환
🔔 dynamic_cast
dynamic_cast
: 동적으로 형변환시킨다. 형변환에 실패할 경우 nullptr를 리턴한다.
#include <iostream>
#include <string>
using namespace std;
class Base
{
public:
int m_i = 0;
virtual void print()
{
cout << "I'm Base" << endl;
}
};
class Derived1 : public Base
{
public:
int m_j = 1024;
virtual void print() override
{
cout << "I'm derived_1" << endl;
}
};
class Derived2 : public Base
{
public:
string m_name = "Dr. Two";
virtual void print() override
{
cout << "I'm derived_2" << endl;
}
};
int main()
{
Derived1 d1;
Base *base = &d1;
auto *base_to_d1 = dynamic_cast<Derived1*>(base);
cout << base_to_d1->m_j << endl;
return 0;
}
auto *base_to_d1 = dynamic_cast<Derived1*>(base);
Derived1 객체를 가리키던 Base * 포인터는 Derived1 * 포인터로 형변환이 가능하다. Derived1 객체와 타입이 일치하기 때문에.
- Base 타입이지만 Derived 객체인
d1
의 주소를 담고 잇는base
포인터가 Derived1 * 포인터 타입으로 형변환.되며d1
의 주소를 리턴한다.- 아래 처럼 되는 것이나 마찬가지.
Derived1 * base_to_d1 = d1;
base_to_d1->m_j
는 Derived1의 m_j를 리턴한다. 1024 출력
- 아래 처럼 되는 것이나 마찬가지.
int main()
{
Derived1 d1;
Base * base = &d1;
auto *base_to_d1 = dynamic_cast<Derived2*>(base);
if (base_to_d1 != nullptr)
cout << base_to_d1->m_name << endl;
else
cout << "Failed" << endl;
return 0;
}
💎출력💎
Failed
Derived1 객체를 가리키던 Base * 포인터는 Derived2 * 포인터로 형변환이 불가능하다. 형제긴 하지만 부모 자식 관계도 아니고 타입이 전혀 다르니 당연한 얘기..
dynamic_cast
는 nullptr을 리턴할 것이고 이에 따라 else문에 해당 되어 “Failed”를 출력한다.dynamic_cast
는 형변환에 실패시 nullptr를 리턴한다.
🔔 static_cast
auto *base_to_d1 = static_cast<Derived2*>(base);
- 원래는 형변환에 실패하는게 맞는데
static_cast
는 되는데로 밀어 붙인다.- 런타임 에러를 체크하지 않으며
- 최대한 어떻게서든 개발자가 원하는 형으로 변환시켜주려는 성질을 가지기 때문에 안되는것도 되게 하는 경우가 있다.
이 같은 문제로
static_cast
보다는dynamic_cast
를 좀 더 추천하지만 다형성에 있어 형변환을 사실 안쓰는 것을 추천한다. 계속 왔다 갔다 하면 데이터 손실로 위험해질 수 있으므로.
🌜 개인 공부 기록용 블로그입니다. 오류나 틀린 부분이 있을 경우
언제든지 댓글 혹은 메일로 지적해주시면 감사하겠습니다! 😄
댓글남기기