将基类向量传递给接受超类向量的函数

Posted

技术标签:

【中文标题】将基类向量传递给接受超类向量的函数【英文标题】:Pass a vector of baseclass to a function which takes vector of superclass 【发布时间】:2017-11-08 09:31:42 【问题描述】:

在我的代码中,我有一个SuperType,它有两个子类型......现在我有一个std::vector<SubTypeA>&,需要将它传递给一个函数,该函数迭代向量并调用来自SuperType 的函数...我需要对这两种子类型执行此操作。

(超类型还不是虚拟的,但我需要在某个时候将其变为虚拟,因为它只是两个子类型的公共部分,不能有它的实例)

这是一个最小(非)工作示例:

#include <vector>
struct Super 
    // stuff and functions
;
struct SubTypeA : public Super 
    // stuff and functions
;

void func(const std::vector<Super>& sup) 
    for (auto& elem: sup) 
        // do things
    
    return;


int main() 
    std::vector<SubTypeA> v; // I get this from another place
    std::vector<SubTypeA>& my_variable = v; // this is what I have in my code
    func(my_variable); // does not work.

传递迭代器也是一种解决方案。


旁注:我从另一种类型获得my_variable

struct SomeContainer 
    std::vector<SubTypeA> a;
    std::vector<SubTypeB> b;

我不想更改容器,所以std::vector&lt;SubTypeA&gt;&amp; 是。

【问题讨论】:

std::vector&lt;Super&gt;std::vector&lt;SubTypeA&gt; 是不同的类型,由于object slicing 的原因,无法无损地从一种转换为另一种。 How to pass a vector of a Child class in to a function expecting a vector of Parent class?的可能重复 【参考方案1】:

在 C++ 中,SuperSubTypeA 类型的引用和指针是协变的,但 std::vector&lt;Super&gt;std::vector&lt;SubTypeA&gt; 不是。您可以使用指针向量或对基类的引用来实现您想要的:

#include <vector>
struct Super 
    // stuff and functions
;
struct SubTypeA : public Super 
    // stuff and functions
;

void func(std::vector<std::reference_wrapper<Super>>& sup) 
    for (Super& elem: sup) 
        // do things
    
    return;


int main() 
    std::vector<SubTypeA> v; // I get this from another place
    // using vector of references to base class
    std::vector<std::reference_wrapper<Super>> my_variable(v.begin(), v.end());        

    func(my_variable); // does not work.

按照 cmets 的建议更新

【讨论】:

或者您可以将func 设为接受开始/结束迭代器的模板。 std::vector 有一个接受一对迭代器的 c'tor。使用它会比编写一个原始循环更短。 另外,std::reference_wrapper 也可以隐式转换为引用。所以也许for (Super&amp; ref: sup) 再次简洁。

以上是关于将基类向量传递给接受超类向量的函数的主要内容,如果未能解决你的问题,请参考以下文章

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

将基类传递给函数而不是派生一个

最佳实践:将派生类的向量传递给基类向量上的方法

如何将子类作为期望基类的函数的参数传递,然后将该对象传递给指向这些抽象类对象的指针向量?

我是不是将基类与超类一起继承以进行多重继承?

在 C++ 中通过引用与按值将向量传递给函数