Item* 하나로 Weapon/Armor를 받아도 “실제 타입 출력”이 되는 이유dynamic_cast 또는 타입 체크 후 변환)item->PrintInfo()만으로도 타입별 출력이 가능한지 설명할 수 있다.Item* item으로 받으면 Weapon::GetDamage() 같은 자식 전용 멤버는 바로 접근할 수 없습니다.핵심 아이디어:
virtual PrintInfo()를 선언하고override로 각자 구현하면item->PrintInfo()만 호출하면 됩니다.#include <iostream>
class Item {
public:
virtual ~Item() = default;
virtual void PrintInfo() const
{
std::cout << "[아이템 공통 정보]\n";
}
};
class Weapon : public Item {
public:
void PrintInfo() const override
{
Item::PrintInfo(); // 필요하면 부모 정보 먼저 출력
std::cout << "[공격력] : " << _damage << '\n';
}
private:
int _damage = 10;
};
class Armor : public Item {
public:
void PrintInfo() const override
{
Item::PrintInfo();
std::cout << "[방어력] : " << _defence << '\n';
}
private:
int _defence = 5;
};
포인트:
override는 선언부(클래스 내부)에서 사용합니다.const를 붙이는 습관이 좋습니다.타입 전용 데이터를 꼭 꺼내야 한다면 캐스팅이 필요할 수 있습니다.
이때는 C-Style 캐스팅보다 안전 장치를 둔 방식이 좋습니다.
void PrintExtra(const Item* item)
{
if (const Weapon* w = dynamic_cast<const Weapon*>(item)) {
// Weapon 전용 처리
// std::cout << w->GetDamage() << '\n';
} else if (const Armor* a = dynamic_cast<const Armor*>(item)) {
// Armor 전용 처리
// std::cout << a->GetDefence() << '\n';
}
}
실전 기준:
Item* item에 Weapon이 들어 있을 때 item->PrintInfo()가 Weapon 버전을 호출하는 이유는?dynamic_cast를 선호하는 이유는?