无法返回包含派生指针的向量
Cannot return vector containing derived pointers
好吧,所以为了说明我的问题,我将显示一些(伪)代码。
可以说我有以下模型:
class Animal : public GameObject;
class Player : public GameObject;
class GameObject : public ObjectInterface;
class ObjectInterface
{
public:
virtual ~ObjectInterface() = default;
virtual vec3 GetPosition() = 0;
}
现在,我还拥有一些"对象上下文",其中包含某些游戏对象的集合。
class ContextObject
{
// they implement ObjectInterface
vector<shared_ptr<Animal>> animals;
vector<shared_ptr<Player>> players;
}
现在我有一个TargetSelector
类,它直接与ObjectInterface
一起工作。
class TargetSelector
{
// this is somehow not possible, although `animals` are a subclass of `ObjectInterface`
vector<shared_ptr<Model::ObjectInterface>>& GetAvailableTargets()
{
return context->animals; // context is some `ObjectContext`
}
}
我希望上述代码可以工作,因为Animal
是ObjectInterface
类型。但是,我遇到了一个错误,说它不能从vector<shared_ptr<Animal>>
转换为vector<shared_ptr<ObjectInterface>>
。这甚至可以工作吗?
有人可以向我解释为什么我不能做这种多态性,如果可能的话,我可以做到这一点。
谢谢,任何帮助都将不胜感激!
我希望上述代码可以工作,因为
Animal
是类型ObjectInterface
。
不幸的是,类模板无法正常工作。
给定
struct Base {};
struct Derived : Base {};
Derived d;
Base& bref = d; // OK.
Base b = d; // OK.
但是,给定
template <tpename T> Foo {};
Foo<Derived> d;
Foo<Base>& bref = d; // Not OK
Foo<Base> b = d; // Not OK.
Derived
是Base
的子类型,并不意味着Foo<Derived>
是Foo<Base>
的子类型。
该类比也适用于shared_ptr
。通过使用另一层类模板,您的问题更加复杂。shared_ptr<Derived>
不是shared_ptr<Base>
的子类型。不介意将vector<shared_ptr<Base>>
摄取时能够使用vector<shared_ptr<Derived>>
。
您可以在所有位置使用vector<shared_ptr<ObjectInterface>>
,并在使用之前确保施放适当的shared_ptr
类型。
在http://en.cppreference.com/w/cpp/memory/shared_ptr/pointer_cast。
pointer_cast
功能
相关文章:
- 有没有一种"cleaner"的方法可以在指向基的指针向量中找到派生类的第一个实例?
- 如何更改唯一指针向量的可见性
- 如何在基类指针向量的元素上应用重载的多态函数
- C++:添加新结构时,结构指针向量中的所有元素都会更新
- 包含指向其他结构的指针向量的结构
- 如何将子类作为函数的参数传递给期望基类,然后将该对象传递到指向这些抽象类对象的指针向量中?
- 如何将字符串指针数组转换为字符串类型的智能指针向量?
- 初始化可变数据结构中的共享指针向量
- 指向具有 decltype 的函数的指针向量
- push_back指向指针向量的指针
- 使用指针向量(带代码)C++(以及对其使用的便利性的怀疑)时出现问题
- 我可以做些什么来改进指针向量中的此搜索?
- 指向指针排序向量的指针向量的 C++ 向量
- 初始化用户定义类的指针向量
- 函数无法识别我在C++传递节点指针向量?
- 如何声明指向类对象的指针向量?
- 指向结构的指针向量的元素具有相同的地址
- 删除指向抽象类的指针向量
- 当我返回指向结构的指针向量时出现段错误
- 用基于范围的for循环填充指针向量