我有两个独立的类层次结构,从BaseClass1
,BaseClass2
这就是我想要做的事情:
struct BaseClass1 {
virtual void obtain_map(std::map<int,BaseClass2> &map) = 0;
}
BaseClass1
的子类会覆盖obtain_map
。但问题是这些子楼应该能够在BaseClass2
参数中使用map
的子类。 (所以从这个意义上说,两个“独立”层次结构的子类实际上是相关的,或者更确切地说,如果子类设计者想要的话)
我如何实现这一目标,还是我被迫从头开始创建自己的map
课程?
答案 0 :(得分:1)
如果您像这样派生类并使用指针作为第二个map
模板参数(像std::unique_ptr
这样的智能指针将为您节省一些内存管理麻烦):
struct BaseClass1 {
virtual void obtain_map(std::map<int, std::unique_ptr<BaseClass2>> &map) = 0;
};
struct DerivedClass1 : public BaseClass1 {
virtual void obtain_map(std::map<int, std::unique_ptr<BaseClass2>> &map) override
{
}
};
您仍然可以使用派生版本的BaseClass2传递maps
作为第二种类型:
struct DerivedClass2 : public BaseClass2;
// ...
std::map<int, std::unique<DerivedClass2>> mdc2;
DerivedClass1 dc1;
dc1.obtain_map(mdc2);
答案 1 :(得分:0)
STL容器只存储固定大小的对象。如果你将BaseClass2派生类对象推送到std::map<int,BaseClass2>
,对象将被切成BaseClass2类型。
如果希望std::map
存储BaseClass2的子类,则需要在地图中存储指针(智能指针)。
例如:
struct BaseClass1 {
virtual void obtain_map(std::map<int, std::unique_ptr<BaseClass2>> &map) = 0;
}
struct DerivedClass1 : public BaseClass1 {
virtual void obtain_map(std::map<int, std::unique_ptr<BaseClass2>> &map)
{
// implementation
}
}
存储smpart指针与原始poiter相比有进步,因为你不需要手动删除指针指向的内存。