无法返回包含派生指针的向量

Cannot return vector containing derived pointers

本文关键字:指针 向量 派生 包含 返回      更新时间:2023-10-16

好吧,所以为了说明我的问题,我将显示一些(伪)代码。

可以说我有以下模型:

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`
    }
}

我希望上述代码可以工作,因为AnimalObjectInterface类型。但是,我遇到了一个错误,说它不能从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.

DerivedBase的子类型,并不意味着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功能