1. static_cast
2. dynamic_cast
3. const_cast
4. reinterpret_cast
Static_cast
- 일반적으로 많이 사용되는 캐스팅
- C스타일 ( (double) num; ) "()" 보다 안전한 타입변환 방법
Static_cast 종류
int i = 10;
double b = static_cast<double> i;
class Base
{};
class Child : public Base
{};
Base* basePtr = new Child;
Child* childPtr = static_cast<Child*>(basePtr);
void *ptr = &i;
int* intPtr = static_cast<int*>(ptr);
enum Player { Human, Monster };
Player player = Human;
int playerInt = static_cast<int>(player);
Dynamic_cast
- RTTI사용 : Run Time Type Information
- virtual을 사용해서 RTTI를 사용해야함 ( virtual을 사용하면 가상 테이블이 생성 == RTTI 정보 )
Dynamic_cast 종류
- 부모 -> 자식으로 가능 캐스팅 (다운캐스팅)
class Base
{
public:
virtual ~Base()
{};
}
class Player : public Base
{}
int main
{
Base* basePtr = new Player(); // Player기본생성자 호출
Player* playerPtr = dynamic_cast<Player*>(basePtr);
// 실패하면 -> playerPtr에 nullptr이 반환됨 (안정성)
return 0;
}
class Base
{
public:
virtual ~Base()
{};
}
class Player : public Base
{}
int main
{
Base* basePtr = new Player(); // Player기본생성자 호출
try
{
Player& player = dynamic_cast<Player&>(*basePtr);
// 실패하면 std::bad_cast 반환
} catch (const std::bad_cast& e)
{
std::cout << "dynamic_cast to Derived1& failed: " << e.what() << std::endl;
}
return 0;
}
Const_cast
void Print(char* str)
{
cout << str << endl;
}
int main()
{
//Print("Hello"); // 불가능 "Hello"는 <const char*>
Print(const_cast<char *>("Hello"));
}
Reinterpret_cast
- 가장 위험하고, 강력한 캐스팅
- 안전하지 않은 캐스팅도 가능하게 한다
int *ptr;
__int8 num = reinterpret_cast<__int8>(ptr); // 주소값을 __int8 (1바이트)로 캐스팅
// 말도안되지만,가능하게 해준다.