将继承类对象的向量传递给期望基类向量的函数

时间:2016-07-18 16:31:37

标签: c++ inheritance vector

我正在使用一个继承自opencv Rect的A类。只是添加了一些我想在执行过程中跟踪的变量。

class A: public Rect { //code, constructors... }

我想使用opencv方法detectMultiScale,它需要一个空的vector<Rect>,并用预期的输出填充它。

如何传递一个继承对象的空向量,就是来自Rect的vector<A>并期望捕获方法内的基类? (我在这一点上理解该方法是一个黑盒子,我不想编译opencv来重新声明一些东西)。

2 个答案:

答案 0 :(得分:1)

我担心自己不会工作,你必须与std::vector<Rect*>合作 - 直觉上,这会在sizeof(Rect) != sizeof(A)时出现,所以即使你的索引也会失败,对于std::vector<Rect>,更不用说类布局了。指针,或者,如果您有一组固定的类型,您可以尝试变体和访问者。

编辑:如果您的用例(detectMultiScale)不允许您传递vector<std::Rect*>,您可以从各种装饰器访问者实现中进行选择。在这种情况下,您必须放弃直接继承。说出一些:

  • 拥有std::vector<Rect>std::vector<ARectV>ARectV包含您在Rect中无法找到的其他字段。

    • 如果您愿意,可以为相应的(已访问过的)Rect添加引用。在这种情况下,构造函数将填充Rect;或
    • 您的ARectV方法可能需要(可能是const)Rect&,在这种情况下,您的构造函数不需要存储它
  • 如果所有其他方法都失败了,请使用静态std::map<Rect*, ARectV> sARectV。这将是较慢的并且需要手动插入/删除(可能在sARectV的构造函数/析构函数中,前者采用 - 可能是const - Rect*Rect&),但允许您编写:{{1} }。当然,它还允许标准表示法,即sARectV[&rect].yourfunction() - 但您可能无法将Rect rect; ARectV rectv(rect); rectv.yourfunction();传递给应该rvRect*的回调。如果按价值计算Rect&,则表示运气不佳。

答案 1 :(得分:1)

  

如何传递一个继承对象的空向量,它是来自Rect的向量并期望捕获方法内的基类?

这是不可能的。该函数需要Rect个对象的向量,因此这是您必须传递的对象。

如果你想要一个A的向量,那么你可以编写一个构造函数A(Rect),它接受​​一个基类的实例作为参数,并相应地初始化基础子对象。然后编写一个转换获取的Rect实例的循环。