C ++在地图中存储派生对象

时间:2011-12-27 11:07:42

标签: c++ object polymorphism stdmap derived

是的,我是c ++的新手,所以我还在这里学习。如果我以错误的方式解决这个问题,请告诉我,但如果可能的话,尽量指出正确的方向(perhpaps指向教程的链接)。

我正在玩std :: map并用它来存储一个对象(item)。这很好用。问题是尝试在地图中存储派生项目。我已经有了它的工作,但它似乎正在切割派生对象。

所以说item有属性a,b和c。食物来源于具有额外属性d和e的项目。当它存储在项目地图中时,我无法访问d和e。编译器说:

“错误:'class item'没有名为'd'的成员”

是否可以使用std :: map polymorphicaly或者我是否需要使用另一个像boost这样的库? Boost看起来相当复杂,我希望在我还在学习的时候有办法用地图做。这是我正在玩的一些代码,以使我更清楚我的意思。

项目地图声明如下:

typedef std::map <int, tItem*> itemMap;

事情就像这样添加:

Item * item = new Item (a, b, c);
itemmap [vnum] = item;
DerivedItem * deriveditem = new DerivedItem (a, b, c, d, e);
itemmap [vnum] = deriveditem;

这样可行,但我无法访问派生项的d和e。

感谢帮助人员

2 个答案:

答案 0 :(得分:3)

如果您知道它是什么类,您可以使用dynamic_cast强制转换为派生类。

dynamic_cast<DerivedItem*>(itemmap[vnum])->derivedFunction();

http://en.wikipedia.org/wiki/Dynamic_cast

如果您希望自动完成此操作,可以从std :: map派生新的模板类,其中[]运算符具有模板参数。但在这种情况下,你必须在获得项目时传递类型:

itemmap<DerivedItem>[vnum]->derivedFunction()

答案 1 :(得分:0)

您将无法使用DerivedItem指针访问特定于Item类的成员。你可以施展它:

val = static_cast<DerivedItem*>(itemmap[vnum])->d;

....但这取决于知道哪些项目是地图中的哪种类型。

对于多态行为,通常会在派生类中重写父类中的方法,行为方式不同。