[英]C++ storing derived objects within a map
是的,我对C ++还是很陌生,所以我还在这里学习。 如果我以错误的方式进行操作,请告诉我,但如果可能,请尝试指出正确的方向(perhpaps带有指向教程的链接)。
我一直在玩std :: map,并用它来存储对象(项目)。 这很好。 问题是试图将派生项存储在地图中。 我有它的工作,但它似乎正在切片派生的对象。
所以说item具有属性a,b和c。 食物是从具有额外属性d和e的商品中获得的。 将d和e存储在项目映射中时,我无法访问它。 编译器说:
“错误:“类项目”没有名为“ d”的成员”
是否有可能使用std :: map多态性?还是需要使用另一个类似boost的库? Boost似乎相当复杂,我希望在我仍在学习的同时,有一种方法可以使用map来做到这一点。 这是我正在使用的一些代码,以使我的意思更清楚。
项目地图声明为:
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。
谢谢你们的帮助
如果您知道它是什么类,则可以使用dynamic_cast
强制返回到派生类。
dynamic_cast<DerivedItem*>(itemmap[vnum])->derivedFunction();
http://en.wikipedia.org/wiki/Dynamic_cast
如果希望自动完成此操作,则可以从std :: map派生新的模板类,其中[]
运算符具有模板参数。 但是在这种情况下,您必须在获取商品时传递类型:
itemmap<DerivedItem>[vnum]->derivedFunction()
您将无法使用Item
指针访问特定于DerivedItem
类的成员。 您可以将其转换为:
val = static_cast<DerivedItem*>(itemmap[vnum])->d;
....但这取决于了解地图中哪些项目是哪种类型。
对于多态行为,通常在父类中有一个行为会有所不同的方法,该方法在派生类中被覆盖。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.