将一个baseclass向量传递给一个带有超类

时间:2017-11-08 09:31:43

标签: c++ inheritance vector abstraction supertype

在我的代码中,我有一个SuperType,它有两个SubTypes ...现在我有一个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<SubTypeA>&就是这样。

1 个答案:

答案 0 :(得分:3)

在c ++中,类型SuperSubTypeA的引用和指针是协变的,但std::vector<Super>std::vector<SubTypeA>不是。您可以使用指针向量或对基类的引用来实现您想要的目标:

#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.
}

按照评论中的建议更新