0

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

这就是我想要做的:

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

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

我怎样才能做到这一点,还是我被迫map从头开始创建自己的课程?

4

2 回答 2

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
    {
    }
};

您仍然可以将mapsBaseClass2 的派生版本作为第二种类型传入:

struct DerivedClass2 : public BaseClass2;
// ...

std::map<int, std::unique<DerivedClass2>> mdc2;
DerivedClass1 dc1;
dc1.obtain_map(mdc2);
于 2013-02-09T00:06:59.417 回答
0

STL 容器只存储固定大小的对象。如果将 BaseClass2 派生类对象推送到std::map<int,BaseClass2>,则对象将被切片为 BaseClass2 类型。

如果要std::map存储 BaseClass2 的子类,则需要在 map 中存储指针(智能指针)。

例如:

  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 指针与原始指针相比具有进步,因为您不需要手动删除指针指向的内存。

于 2013-02-09T00:05:12.647 回答