C将基类和派生类对象存储在一起
发布时间:2020-12-16 09:48:23 所属栏目:百科 来源:网络整理
导读:我有两节课: 第一: class Thing {public: int code; string name; string description; int location; bool canCarry; Thing(int _code,string _name,string _desc,int _loc,bool _canCarry) { code = _code; name = _name; description = _desc; location
我有两节课:
第一: class Thing { public: int code; string name; string description; int location; bool canCarry; Thing(int _code,string _name,string _desc,int _loc,bool _canCarry) { code = _code; name = _name; description = _desc; location = _loc; canCarry = _canCarry; } }; 第二: class Door: public Thing { private: bool open; public: int targetLocation; Door(int _code,int _targetLoc) : Thing(_code,_name,_desc,_loc,false) { open = false; targetLocation = _targetLoc; } void Use() { open = true; } void Close() { open = false; } bool isOpen() { return open; } }; 忘记私人/公共属性…… 我需要存储基类的一些对象和派生类的一些对象, vector < Thing*> allThings; things.push_back(new Thing(THING1,"THING1","some thing",LOC1,true)); things.push_back(new Door(DOOR1,"DOOR1","some door",LOC2)); 但在这种情况下,由于切片,函数Use(),Open()和isOpen()将无法访问. 您是否有一些建议,如何将这些对象存储在一起而不创建向量的新结构< Thing *>和矢量< Door *> ?? 谢谢 解决方法
当您需要具有多态行为的对象容器时,问题的一个很好的解决方案是唯一指针的向量:
std::vector<std::unique_ptr<Thing>> 在这种情况下不会有切片,但你必须弄清楚什么时候可以调用Use(),Open()和isOpen(). 如果你可以将派生类中的方法移动到基础中,那就去吧;如果你不能这样做,因为对于拥有isOpen()的东西是没有意义的,考虑使用更高级的解决方案,例如Visitor Pattern: class Thing; class Door; struct Visitor { virtual void visitThing(Thing &t) = 0; virtual void visitDoor(Door &d) = 0; }; class Thing { ... virtual void accept(Visitor &v) { v.visitThing(*this); } }; class Door : public Thing { ... virtual void accept(Visitor &v) { v.visitDoor(*this); } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |