C++ 如何将子类向量传递给需要基类向量的函数

C++ 如何将子类向量传递给需要基类向量的函数,c++,stdvector,C++,Stdvector,我有一个基类和一个子类: 还有一个函数,需要一个基向量,如下所示: void doSomeThing(vector<Base> vectorOfBases){ // ... } vector<Sub> myVectorOfSubs; doSomeThing(myVectorOfSubs); void doSomeThing(基本向量){ // ... } 我需要像这样调用函数: void doSomeThing(vector<Base> vect

我有一个基类和一个子类:

还有一个函数,需要一个基向量,如下所示:

void doSomeThing(vector<Base> vectorOfBases){
    // ...
}
vector<Sub> myVectorOfSubs;
doSomeThing(myVectorOfSubs);
void doSomeThing(基本向量){
// ...
}
我需要像这样调用函数:

void doSomeThing(vector<Base> vectorOfBases){
    // ...
}
vector<Sub> myVectorOfSubs;
doSomeThing(myVectorOfSubs);
vectorMyVectorOfSubs;
剂量测定法(myVectorOfSubs);
编译器告诉我:

没有从vector到vector的适当转换

那么,我如何将子类的向量传递给需要基类向量的函数呢

那么,我如何将子类的向量传递给需要基类向量的函数呢

你不能

std::vector
std::vector
之间没有超类-子类关系

这里有一种方法可以绕过这个限制。将函数更改为使用可与包含
Base
Sub
对象的任何容器一起使用的函数模板

template <typename Container>
void doSomeThing(Container& container)
{
   // Do something for each item of the container assuming that
   // the container contains objects of type Base or any of its derived classes.
   for ( Base& baseRef : container )
   {
     // Use baseRef
   }
}
模板
无效剂量测定(容器和容器)
{
//对容器中的每个项目执行一些操作,假设
//容器包含Base类型的对象或其任何派生类。
用于(基本和基本参考:容器)
{
//使用baseRef
}
}
那么,我如何将子类的向量传递给需要基类向量的函数呢

你不能

std::vector
std::vector
之间没有超类-子类关系

这里有一种方法可以绕过这个限制。将函数更改为使用可与包含
Base
Sub
对象的任何容器一起使用的函数模板

template <typename Container>
void doSomeThing(Container& container)
{
   // Do something for each item of the container assuming that
   // the container contains objects of type Base or any of its derived classes.
   for ( Base& baseRef : container )
   {
     // Use baseRef
   }
}
模板
无效剂量测定(容器和容器)
{
//对容器中的每个项目执行一些操作,假设
//容器包含Base类型的对象或其任何派生类。
用于(基本和基本参考:容器)
{
//使用baseRef
}
}
vector
vector
分别保存实际的
Base
Sub
对象。它们是不同的向量类型,它们的数据数组也不同,所以不能只在需要向量的地方传递向量。如果尝试使用
Sub
对象构建
向量

要使代码正常工作,您可以:

  • 将函数改为使用
    向量
    ,然后可以构造一个
    向量
    ,其元素指向
    向量
    元素,例如:

    void doSomeThing(std::vector<Base*> &vectorOfBasePtrs) {
        for (Base *b : vectorOfBasePtrs) {
            // ...
        }
    }
    

  • 将函数更改为获取一对迭代器,而不是容器本身,然后可以从
    向量
    传入迭代器:

    模板
    void doSomeThing(迭代器开始、迭代器结束){
    while(开始!=结束){
    基本b=*开始;
    // ...
    ++开始;
    }
    }
    

    std::vector myVectorOfSubs;
    ...
    doSomeThing(myVectorOfSubs.begin(),myVectorOfSubs.end());
    
vector
vector
分别持有实际的
Base
Sub
对象。它们是不同的向量类型,它们的数据数组也不同,所以不能只在需要向量的地方传递向量。如果尝试使用
Sub
对象构建
向量

要使代码正常工作,您可以:

  • 将函数改为使用
    向量
    ,然后可以构造一个
    向量
    ,其元素指向
    向量
    元素,例如:

    void doSomeThing(std::vector<Base*> &vectorOfBasePtrs) {
        for (Base *b : vectorOfBasePtrs) {
            // ...
        }
    }
    

  • 将函数更改为获取一对迭代器,而不是容器本身,然后可以从
    向量
    传入迭代器:

    模板
    void doSomeThing(迭代器开始、迭代器结束){
    while(开始!=结束){
    基本b=*开始;
    // ...
    ++开始;
    }
    }
    

    std::vector myVectorOfSubs;
    ...
    doSomeThing(myVectorOfSubs.begin(),myVectorOfSubs.end());
    

我试过这个石膏剂量((vector&)myVectorOfSubs);编译器接受这一点,但在运行时生成异常。
std::vector
s包含相关类,它们本身并不相关。
std::vector
std::vector
之间没有特殊关系。请注意,如果您尝试将
std::vector
的元素放入
std::vector
中,您将体验到。您不能<代码>矢量和
矢量
是完全不同的类型。通常的方法是传递一对迭代器。一个指针和一个长度在紧要关头也可以。是的,弗朗索瓦·安德烈我知道,但我不关心Sub.paramnwp。你能解释一下如何传递这对迭代器吗?我试过这个cast doSomeThing((vector&)myVectorOfSubs);编译器接受这一点,但在运行时生成异常。
std::vector
s包含相关类,它们本身并不相关。
std::vector
std::vector
之间没有特殊关系。请注意,如果您尝试将
std::vector
的元素放入
std::vector
中,您将体验到。您不能<代码>矢量和
矢量
是完全不同的类型。通常的方法是传递一对迭代器。一个指针和一个长度在紧要关头也可以。是的,弗朗索瓦·安德烈我知道,但我不关心Sub.paramnwp。你能解释一下如何传递这对迭代器吗?
template<typename Container>
void doSomeThing(Container &containerOfObjs) {
    for (Base &b : containerOfObjs) {
        // ...
    }
}
template <typename Iterator>
void doSomeThing(Iterator begin, Iterator end) {
    while (begin != end) {
        Base &b = *begin;
        // ...
        ++begin;
    }
}
std::vector<Sub> myVectorOfSubs;
...

doSomeThing(myVectorOfSubs.begin(), myVectorOfSubs.end());