地图中的派生类

时间:2013-02-08 23:57:53

标签: c++

我有两个独立的类层次结构,从BaseClass1BaseClass2

开始

这就是我想要做的事情:

struct BaseClass1 {
  virtual void obtain_map(std::map<int,BaseClass2> &map) = 0;
}

BaseClass1的子类会覆盖obtain_map。但问题是这些子楼应该能够在BaseClass2参数中使用map的子类。 (所以从这个意义上说,两个“独立”层次结构的子类实际上是相关的,或者更确切地说,如果子类设计者想要的话)

我如何实现这一目标,还是我被迫从头开始创建自己的map课程?

2 个答案:

答案 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相比有进步,因为你不需要手动删除指针指向的内存。