class IItem {};
class IDrinkable {};
class IEquipment : public IItem {};
class Weapon : public IEquipment {};
class Armor : public IEquipment {};
class Potion : public IItem, public IDrinkable {};

std::list<shared_ptr<IItem>> items;

コンテナにつっ込まれた要素の、元の型を知りたい時に、IItem クラスは何を用意することがベストだろうか

1. 何も用意しない。dynamic_cast を使用する

2. virtual ItemType GetType() = 0
 enum ItemType {
  ItemType_Weapon, // Weapon クラスはこれを返す。
  ItemType_Armor, // Armor クラスはこれを返す。
  ...
 }

3. virtual Weapon * CastToWeapon() { return NULL; }
 Weapon クラスはオーバーライドして、this を返す。
 他の派生したクラスへキャストする関数も用意する。

4. その他