Notice
Recent Posts
Recent Comments
Link
오븐 노트
[C++] 캐스팅 4총사 본문
#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 |