class HogeItem : public Item { ... };

class Foo
{
 virtual shared_ptr<Item> GetItem() const;
};

class Bar : public Foo
{
 // �@
 virtual shared_ptr<HogeItem> GetItem() const { return this->pItem; }

 // �A
 virtual shared_ptr<Item> GetItem() const { return this->pItem; }
 virtual shared_ptr<HogeItem> GetX() const { return this->pItem; }

 shared_ptr<HogeItem> pItem;
};

shared_ptrを戻り値としたばあい共変性が保てないんだな
�@が無理だと知ったんだけど、�Aの方法を取るしかないの?
あと、�AのGetX(仮)関数の名前はどんなのがいいだろう?