如何将子类向量传递给需要基类向量的函数
How can I pass a vector of subclass to a function that requires a vector of base class
我有一个基类和一个子类:
class Base{
public:
Base(){}
// ...
};
class Sub: public Base{
int param;
public:
Sub(){}
// ...
};
而且我还有一个函数需要像这样的Base向量:
void doSomeThing(vector<Base> vectorOfBases){
// ...
}
我需要像这样调用函数:
vector<Sub> myVectorOfSubs;
doSomeThing(myVectorOfSubs);
编译器告诉我:
没有从矢量<子>到矢量的适当转换<基本>基本>子>
那么如何将 Sub 类的向量传递给需要基类向量的函数呢?
vector<Base>
和vector<Sub>
分别保存实际的Base
和Sub
对象。 它们是不同的向量类型,并且它们的数据数组不同,因此您不能只传递预期vector<Base>
的vector<Sub>
。 如果尝试使用Sub
对象构建vector<Base>
,则会发生切片。
要使代码正常工作,您可以:
-
将函数更改为采用
vector<Base*>
,然后您可以构造一个元素指向vector<Sub>
元素的vector<Base*>
,例如:void doSomeThing(std::vector<Base*> &vectorOfBasePtrs) { for (Base *b : vectorOfBasePtrs) { // ... } }
std::vector<Sub> myVectorOfSubs; ... std::vector<Base*> myVectorOfBasePtrs; myVectorOfBasePtrs.resize(myVectorOfSubs.size()); std::transform(myVectorOfSubs.begin(), myVectorOfSubs.end(), myVectorOfBasePtrs.begin(), [](Sub &s){ return static_cast<Base*>(&s); } ); /* or: myVectorOfBasePtrs.reserve(myVectorOfSubs.size()); for (Sub &s : myVectorOfSubs) { myVectorOfBasePtrs.push_back(&s); } */ doSomeThing(myVectorOfBasePtrs);
-
更改函数以采用
vector<T>
,其中T
是模板参数(理想情况下,通过std::enable_if
和std::is_base_of
使用 SFINAE 以确保T
实际上是Base
或从Base
派生的类型):template<typename T> void doSomeThing(std::vector<T> &vectorOfObjs) { for (Base &b : vectorOfObjs) { // ... } }
std::vector<Sub> myVectorOfSubs; ... doSomeThing(myVectorOfSubs);
-
更改函数以采用实际容器的模板化
T
,而不是容器元素类型:template<typename Container> void doSomeThing(Container &containerOfObjs) { for (Base &b : containerOfObjs) { // ... } }
-
将函数更改为采用一对迭代器而不是容器本身,然后您可以从
vector<Sub>
传入迭代器: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());
那么如何将 Sub 类的向量传递给需要基类向量的函数呢?
你不能。
std::vector<Base>
和std::vector<Sub>
之间没有超类-子关系。
这是绕过该限制的一种方法。 将函数更改为使用可处理包含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
}
}
相关文章:
- 如何通过派生类函数更改基类中的向量
- 如何在基类指针向量的元素上应用重载的多态函数
- 如何将子类作为函数的参数传递给期望基类,然后将该对象传递到指向这些抽象类对象的指针向量中?
- 如何访问基类向量中的子类变量?(对于实体组件系统)
- CRTP 与基类向量
- 基类到派生类的强制转换向量
- 创建基类指针的向量并将派生类对象传递给它(多态性)
- 有没有办法复制派生类指针的向量而不将其强制转换为基类?
- 无法将派生类存储在基类指针的向量中
- 基类类型向量中的派生结构
- 返回纯虚拟基类的向量的元素
- 基类中向量的干净实例化
- 带有基类指针的强制转换向量,指向子类
- 具有向量成员的基类<int>
- 将抽象派生类对象存储在基类向量中
- 如何从基类向量达到派生的类变量
- 如何为基类通用类型创建向量以使用具体类型元素
- 从基类对象的向量中获取特定派生类的对象
- 将子类添加到基类向量C++不起作用
- 如何将子类向量传递给需要基类向量的函数