코가손의 블로그
C++ 캐스팅(static_cast, dynamic_cast, const_cast, reinterpret_cast) 본문
static cast
"상식적인" 캐스팅만 허용
상식적인 : int <-> float, Player* -> Knight*(다운 캐스팅)
int hp = 100;
int maxHp = 200;
float ratio = static_cast<float>(hp / maxHp);
Player* p = new Knight();
Knight* k = static_cast<Knight*>(p);
dynamic cast
상속 관계에서의 안전한 형변환, 다형성을 활용한 방식
RTTI(Runtime Type Information)
- Runtime에서 관리하는 정보, vftable, 실시간으로 동작할 때 타입을 확인할 수 있는 기법
- dynamic cast를 이용하고 싶으면 virtual 함수가 있어야 한다.
class Player
{
public:
virtual ~Player() {}
}
class Knight : public Player
{
public:
}
class Archer : public Player
{
public:
}
int main()
{
Player* p = new Archer();
Knight* k1 = static_cast<Knight*>(p);
// p는 Archer를 포인팅하고 있기 때문에 잘못된 캐스팅이 일어났음
Knight* k = dynamic_cast<Knight*>(p);
// virtual함수를 하나라도 만들면, 객체의 메모리에 가상함수 테이블(vftable) 주소가 기입
// 가상테이블에 기입 되어 있는 타입을 확인할 수 있으니
// 잘못된 타입으로 캐스팅 했다면 nullptr을 반환함
}
const cast
const를 붙이거나 땔 때 활용
공식 라이브러리에서 지원한 함수를 사용해야하는데 const일 때 주로 사용
reinterpret cast
형태를 다시 캐스팅하는 가장 위험한 캐스팅
전혀 관계없는 다른 타입으로 변환 등에 활용함
'C++ > 문법' 카테고리의 다른 글
C++ 중괄호 초기화 {} (0) | 2021.11.11 |
---|---|
C++ 콜백 함수 (0) | 2021.11.11 |
C++ 문자와 문자열 (0) | 2021.11.11 |
C++ 동적 할당 (0) | 2021.11.11 |
C++ 연산자 오버로딩 (0) | 2021.11.11 |
Comments