오븐 노트

[C++] 캐스팅 4총사 본문

Develop/C++

[C++] 캐스팅 4총사

오 븐 2023. 3. 3. 12:49
#include <iostream>
using namespace std;

// 캐스팅 (타입 변환)
// 면접 단골 질문
// 구시대적 C 스타일의 캐스팅은 버려야함
// ex) (int) x / static_cast<int> o

class Player
{
public:
	virtual ~Player() { }
};

class Knight : public Player
{
public:
};

class Archer : public Player
{
public:
};

class Dog
{

};

// 1) static_cast -> 사용 빈도 제일 높음
// 2) dtnamic_cast -> 두번째로 빈도 높음
// 3) const_cast -> 거의 사용하지 않지만 면접용으로라도 알아두기
// 4) reinterpret_cast -> 사용 빈도 낮음 (면접대비 특징숙지)

void PrintName(char* str)
{
	cout << str << endl;
}

int main()
{
	// static_cast : 타입 원칙에 비춰볼 때 상식적인 캐스팅만 허용
	// 1) int <-> float
	// 2) Player* -> Knight* (부모클래스에서 자식 클래스로 변환하는 다운캐스팅) << 단, 안정성 보장 못함
	
	int hp = 100;
	int maxHp = 200;
	float ratio = static_cast<float>(hp) / maxHp;

	// 부모->자식 자식->부모
	Player* p = new Knight();
	Knight* k1 = static_cast<Knight*>(p);

	// dynamic_cast : 상속 관계에서의 안전 형변환
	// RTTI (RunTime Type Information)
	// 다형성을 활용하는 방식
	// - virtual 함수를 하나라도 만들면, 객체의 메모리에 가상 함수 테이블 (vftable) 주소가 기입된다
	// - 만약 잘못된 타입으로 캐스팅을 했으면, nullptr 반환 *****중요*****
	// 이를 이용해서 맞는 타입으로 캐스팅을 했는지 확인하는것에 유용하다.
	Knight* k2 = dynamic_cast<Knight*>(p);

	// const_cast : const를 붙이거나 떼거나
	PrintName(const_cast<char*>("Oven")); // 변환하지 않으면 기본형이 const char형이기 때문에 매개변수 넘기기 불가능

	// reinterpret_cast
	// 가장 위험하고 강력한 형태의 캐스팅
	// 're-interpret' : 다시-간주하다/생각하다
	// - 포인터랑 전혀 관계 없는 다른 타입 변환 등
	__int64 address = reinterpret_cast<__int64>(k2);

	Dog* dog1 = reinterpret_cast<Dog*>(k2);

	void* p = malloc(1000);
	Dog* dog2 = reinterpret_cast<Dog*>(p);

	return 0;
}

[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문 - 인프런 | 강의
 
C++ 카테고리의 글은 인프런 Rookiss님의 강의를 공부하며 정리하는 내용입니다.
이미 알고 있는 내용도 다시 정리 되어있을 수 있습니다.

 

모든 글은 제가 공부하기 위해 작성합니다.

'Develop > C++' 카테고리의 다른 글

[C++] 전방선언  (0) 2023.03.08
[C++] TextRPG (OOP) #1~3  (0) 2023.03.03
[C++] 얕은 복사 VS 깊은 복사 #1~2  (0) 2023.02.28
[C++] 타입 변환 #4~5  (0) 2023.02.15
[C++] 타입 변환 #3  (0) 2023.02.15