映射中的派生类

derived classes in maps

本文关键字:派生 映射      更新时间:2023-10-16

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

这就是我想做的:

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

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

我该如何做到这一点,还是被迫从头开始创建自己的map类?

如果您像这样派生类,并使用指针作为第二个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);
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指针与原始指针相比有进步,因为您不需要手动删除指针指向的内存。