C++ Chapter 12.10 : 동적 형변환 dynamic_cast

Date:     Updated:

카테고리:

태그:

인프런에 있는 홍정모 교수님의 홍정모의 따라 하며 배우는 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를 좀 더 추천하지만 다형성에 있어 형변환을 사실 안쓰는 것을 추천한다. 계속 왔다 갔다 하면 데이터 손실로 위험해질 수 있으므로.



🌜 개인 공부 기록용 블로그입니다. 오류나 틀린 부분이 있을 경우 
언제든지 댓글 혹은 메일로 지적해주시면 감사하겠습니다! 😄

맨 위로 이동하기

Cpp 카테고리 내 다른 글 보러가기

댓글 남기기