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到vectorstd::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());
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());