Static Cast
Type 원칙에 상식적인 Cast.
1) int ↔ float
2) Player* → Kinght( Down Casting ) << 단 안정성 보장 못함
안정성을 보장하지 못한다는 것은?
int main(){ Player* p = new Archer(); Knight* k = static_cast<Kngiht*>(p); }
위와 같은 경우 Archer와 Knight 모두 Player를 상속 받고 있지만 서로가 완전히 다른 객체이기에
할당되는 메모리 사이즈가 다름, 이에 static cast를 통해 강제로 다운 캐스팅을 진행 시,
메모리 침범 가능성이 있음.
Dynamic Cast
상속 관계에서 안전한 형 변환을 지원. 즉 Static Cast에서 안정성을 보장하지 못한 것을 보안 함.
RTTI ( RunTime Type Information ) 다형성을 활용한 방식.
즉, 해당 기능을 사용하려면, 부모 Class에 반드시 virtual function이 필요함.
class Player { public: virtual ~Player() {}; }; class Knight : public Player { public: }; class Archer : public Player { public: }; int main() { Player* player = new Knight(); Knight* kinght = dynamic_cast<Knight*>(player); }
위와 같이 사용 가능.
virtual 함수를 하나라도 만들면, 객체의 메모리에 가상 함수 테이블이 만들어지고 (vftable) 주소가 기입이 되어 이걸 이용하여, 실제로 캐스팅을 할 때, 맞는 타입인지 체크를 해주는 원리임.
혹시라도 잘못된 타입으로 캐스팅을 했으면 nullptr을 반환한다.
int main(){ Player* p = new Archer(); Knight* k = dynamic_cast<Kngiht*>(p); }
Const Cast
const 타입을 때거나 붙이거나 할 때 사용
Reinterpret Cast
전혀 연관성이 없는 타입 변환을 할 때 사용.
Dog* dog = static_cast<Dog*>(knight);
컴파일 에러.
Dog* dog = reinterpret_cast<Dog*>(knight)