gpt4 book ai didi

c++ - 虚拟功能 : Iterating over a vector that is populated with subclass objects

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:10:20 24 4
gpt4 key购买 nike

简短描述:
我正在迭代一个 vector ,在 vector 中的每个对象上调用一个虚函数,以执行一系列操作。 vector 和迭代器一样属于基类。所有的对象都是 child 。当调用虚函数时,它会执行基类的函数。

(真的)长描述:我正在尝试为具有一组行为的生物建模。我的基类是抽象的,只有两个函数(虚拟),所有子类都已覆盖:

class Behavior
{
public:
Behavior();
~Behavior(void){}
virtual void execute(){}
virtual BEHAVIOR_TYPE getType() {return m_Type;}


protected:
BEHAVIOR_TYPE m_Type;
};

我创建了一些子行为,比如移动、消耗、侦察等。

class Move :
public Behavior
{
public:
BEHAVIOR_TYPE getType() {return m_Type;}
enum Direction {N, NE, E, SE, S, SW, W, NW};
Move(DOCO * d);
~Move(void);
void execute() ;
Direction chooseDirection();
void setDirection(Direction newDirection);
private:
Direction m_Direction;
DOCO *I;
BEHAVIOR_TYPE m_Type;

};

我创建了一个 vector ,将每个 Behavior 子类的实例以及遍历它的迭代器推送到该 vector 上:

vector<Behavior> m_Behavior;
vector<Behavior>::iterator bIt;

当生物获得一个 Action 序列时,我尝试遍历 vector ,取消引用迭代器,并调用执行函数:

void World::justDoIt()
{
for(dIt=myDOCO.begin(); dIt!=myDOCO.end(); ++dIt)
{
vector<Behavior>::iterator myBehavior=(dIt)->getFirstBehavior();
vector<Behavior>::iterator end=(dIt)->getLastBehavior();
for(myBehavior; myBehavior!=end; ++myBehavior)

(*myBehavior).execute();
}
}

问题在于它执行父函数而不是子函数。

在我对后期绑定(bind)的理解中,它应该根据调用它的对象类型而不是调用它的指针类型自动调用适当的函数,并且在我的代码中我预计它会指向子对象。

显然我犯了一个错误,并以某种方式告诉程序我希望将它们视为 parent 而不是 child ,但我找不到我的错误。

第二个症状是它不会让我让父函数成为纯虚拟的,因为它说它不能实例化一个抽象类。我没有在我的代码中的任何地方显式地实例化它,但我肯定在某个地方隐式地做了它。但是,我找不到位置。当然创建一个 vector 来保存父类的对象不需要实例化父类,那是我唯一一次直接引用父类。

如有任何帮助,我们将不胜感激。

最佳答案

类(class)vector<Behavior>使用复制构造函数复制您存储在其中的任何内容 Behavior::Behavior(const Behavior&); .这破坏了多态性。您需要在容器中改用指针或智能指针:

vector<Behavior*> m_Behavior; // I will take care of new and delete
vector<shared_ptr<Behavior> > m_Behavior; // easier

如果你没有 std::shared_ptrstd::tr1::shared_ptr#include <memory>或类似的,也许你可以使用 Boost 的。

关于c++ - 虚拟功能 : Iterating over a vector<Base Class> that is populated with subclass objects,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5200663/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com