ItemType 기반 분기와 dynamic_cast 기반 분기의 선택 기준dynamic_cast와 ItemType + static_cast를 상황에 맞게 선택할 수 있다.Weapon은 Item이므로 Weapon* -> Item*는 암시적으로 허용됩니다.Item* item = new Weapon(); // 업캐스팅 (암시적)
item->PrintInfo(); // 가상 함수면 실제 Weapon 버전 호출
Item*가 항상 Weapon*를 가리키는 건 아닙니다.Item* -> Weapon*은 암시적으로 허용되지 않으며, 강제 캐스팅은 위험합니다.위험한 예:
Weapon* w = (Weapon*)item; // ❌ 실제로 Armor일 수도 있음 (UB 위험)
dynamic_cast로 런타임 검증if (Weapon* w = dynamic_cast<Weapon*>(item)) {
int dmg = w->GetDamage();
} else if (Armor* a = dynamic_cast<Armor*>(item)) {
int def = a->GetDefence();
}
포인트:
nullptr를 반환합니다.dynamic_cast + 널 체크 조합이 안전합니다.dynamic_cast를 쓰려면 기반 클래스(Item)가 다형 타입이어야 합니다.virtual 함수가 최소 하나 필요)ItemType + static_cast (규칙을 엄격히 지킬 때)if (item->GetItemType() == IT_Weapon) {
Weapon* w = static_cast<Weapon*>(item);
int dmg = w->GetDamage();
} else if (item->GetItemType() == IT_Armor) {
Armor* a = static_cast<Armor*>(item);
int def = a->GetDefence();
}
주의:
ItemType 값과 실제 객체 타입이 어긋나면 바로 위험해집니다.virtual) 우선dynamic_cast (안전성 우선)ItemType + static_castdynamic_cast와 ItemType + static_cast의 트레이드오프는 무엇일까?