我在我的程序中遇到了向上转型和向下转型的问题。我有一个 `vector`,它被传递给一个期望 `const vector& pp` 的函数中。在这里没有问题(编辑:显然是有问题的!请参见评论)。但是,现在我想将 `pp` 传递给一个期望 `const vector& cc` 的函数中,而我不能这样做。
在不给函数修改原始类的能力的同时,我该如何做到这一点?您能列出各种方法,并说明它们的优缺点吗?
在不给函数修改原始类的能力的同时,我该如何做到这一点?您能列出各种方法,并说明它们的优缺点吗?
template<T>
void performAction(vector<T> objects) {
// ...
}
另一种方法是使用(智能)指针替换值 - 它们可以轻松处理多态。
编辑:
为了说明我在最后一句话中的意思: 你可以简单地使用vector<unique_ptr<Parent>>
或vector<shared_ptr<Parent>>
来存储任何Parent
实例(包括Child
),因此您不必执行容器的任何类型转换。
vector<Parent*>
和vector<Child*>
是完全无关的,你只能在所有地方都使用vector<Parent*>
。 - molbdnilovector<Parent*>
来存储Parent
和Child
的实例,这样转换类型就不会有问题。但是,是的,我没有说得很清楚。 - Mateusz Kubuszok你可以使用一个模板函数 template func(vector vec) { //根据传入的对象类型做一些操作 }。向量是对象的容器,所以对于一个期望接收一个向量 &pp 的函数,如果我们传递 vector &&cc 将不起作用,代码甚至无法编译。
我们可以使用类似以下的代码:
class A
{
int i;
};
class B : public A
{
int j;
int k;
};
template<class T> void f(vector<T> &p)
{
//can handle both types now
}
int main()
{
B b1;
A a1;
vector<A> vectorA;
vectorA.push_back(a1);
vector<B> vectorB;
vectorB.push_back(b1);
f<B>(vectorB);
f<A>(vectorA);
return 0;
}
vector<Parent>
时,你不能使用vector<Child>
。当然,你可以在期望使用Parent
的地方使用Child
,因为Child
是从Parent
派生出来的;但是vector<Child>
并不是从vector<Parent>
派生出来的。你是否写过一个函数,它接受了一个类似const vector<Parent> &&pp
的参数,并将vector<Child>
传递给它,它能按预期工作吗? - David K你做不到。这是不可能的。
绝对不要这样做:
template<typename TBase, typename TChild>
const std::vector<TBase*>& downcast(const std::vector<TChild*>& children)
{
static_assert(std::derived_from<TChild, TBase>);
return *reinterpret_cast<const std::vector<TBase*>*>(&children);
}
Child
是从Parent
派生出来的,或者反过来,vector<Child>
和vector<Parent>
是无关的,它们是不同的类型。
vector<smart_ptr<Parent>>
,根据你的使用情况选择合适的智能指针变体(unique_ptr
或shared_ptr
)。这样,你仍然可以将Child
对象存储在vector
中,并将其传递给对元素进行多态操作的函数。 - Tony Delroy