簡體   English   中英

虛函數:迭代向量 <Base Class> 用子類對象填充

[英]Virtual Functions: Iterating over a vector<Base Class> that is populated with subclass objects

簡短的介紹:
我正在迭代向量調用向量中的每個對象上的虛函數,以便執行一系列動作。 向量是基類,迭代器也是。 所有的對象都是孩子。 當調用虛函數時,它執行基類的函數。

(真的)長描述:我試圖模擬一個有一系列行為的生物。 我的基類是抽象的,只有兩個函數(虛擬),所有子類都被覆蓋了:

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;

};

我創建了一個向量,我在其上推送了每個Behavior子類的實例以及遍歷它的迭代器:

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

當生物獲得動作序列時,我嘗試迭代向量,取消引用迭代器,並調用執行函數:

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();
}
}

問題是它執行父函數而不是子函數。

在我對后期綁定的理解中,它應該根據調用它的對象的類型而不是調用它的指針類型自動調用適當的函數,並且在我的代碼中我預計它會指向子對象。

顯然我犯了一個錯誤,並以某種方式告訴程序我希望這些被視為父母而不是孩子,但我找不到我的錯誤。

第二個症狀是它不會讓我讓父項功能純虛擬,因為它說它不能實例化一個抽象類。 我沒有在我的代碼中的任何地方顯式地實例化它,但必須有某個地方我隱式地這樣做。 然而,我找不到哪里。 當然,創建一個向量來保存父類的對象不需要實例化父對象,這是我唯一直接引用父類的時間。

任何幫助將不勝感激。

vector<Behavior>使用復制構造函數Behavior::Behavior(const Behavior&);存儲在其中的任何內容的副本Behavior::Behavior(const Behavior&); 這破壞了多態性。 您需要在容器中使用指針或智能指針:

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

如果你沒有#include <memory> std::shared_ptrstd::tr1::shared_ptr或類似的東西,也許你可以使用Boost。

您正在向向量添加類的實例 這導致切片

您需要做的是添加指向行為實例的指針 ,並修改要執行的循環

(*myBehavior)->execute();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM