从包含子类指针的映射转换为包含超类指针的映射

时间:2014-02-11 21:06:11

标签: c++ pointers inheritance stl

所以我有以下简单的类层次结构:

class Parent { ... };
class Child : public Parent { ... };

我想做以下事情:

class Class1 {
  Class1(const hash_map<int64, const Parent*>& parent_map) :
    parent_map_(parent_map) { ... }
 private:
  const hash_map<int64, const Parent*>& parent_map_;
};

随后:

hash_map<int64, const Child*> child_map;
Class1 class_1(child_map);

我收到一条错误消息,指出不存在从hash_map<int64, const Child*>hash_map<int64, const Parent*>的转换。

我也尝试用std::unique_ptr s替换指针,并且看到相同的编译器错误。有什么想法吗?

3 个答案:

答案 0 :(得分:2)

以下是另一种建议:

这里实际上只有一个hash_map个实例。

因此,您只需使用基类声明此实例:

hash_map<int64, const Parent*> map;

然后您可以随意向Parent添加Childmap个实例...

答案 1 :(得分:2)

您可以创建一个新地图,其元素将从原始地图的元素转换而来,例如:

hash_map<int64, const Parent*> parent_map(child_map.begin(), child_map.end());

你必须手动保持两者同步。

答案 2 :(得分:0)

您无法直接执行此操作,因为存储Child对象的容器无法转换为存储Parent对象的容器。您需要逐项进行转换:

hash_map<int64, const Child*> child_map;

// stuff.

hash_map<int64, const Parent*> parent_map(child_map.begin(), child_map.end());
Class1 class_1(parent_map);

或者,正如Kerrek SB建议的那样,只需将指针的hash_map存储到Parent中,您就可以存储它们。