调用派生的虚函数

时间:2013-12-04 10:35:37

标签: c++ function inheritance vector

我仍然是C ++的新手,继承让我陷入困境。 我知道这在C#中有效,因为我总是使用Base。();

我希望能够调用从Entity派生的PlayerCharacter矢量数组。 目前,当我调用它时,它只调用Entity的更新方法。

int main()
{
vector<Entity*> list;
list.push_back(&PlayerCharacter());

   for(int i = 0; i < list.size(); i++)
   {
   list[0]->Update();
   }
}

class Entity
{
public:
    Entity(void);
   ~Entity(void);
    int hitpoints;
    virtual void Update(void);
};
void Entity::Update(void)
{
    int a = 0;
    a++;
}
class PlayerCharacter : public Entity
{
public:
    PlayerCharacter(void);
    ~PlayerCharacter(void);
    bool Move();
    void Update() override;
};
void PlayerCharacter::Update(void)
{
    int a = 0;
    a--;
}

2 个答案:

答案 0 :(得分:4)

list.push_back(&PlayerCharacter());我认为这是代码中未定义的行为。

在你的情况下,你应该在堆上分配数据:list.push_back( new PlayerCharacter() );否则如果你这样做&PlayerCharacter()那么PlayerCharacter变量将被立即销毁,列表中的指针将指向垃圾字节。

另外,为了跟踪调用哪个函数,您可以使用调试器或从每个Update函数在控制台中打印一些内容。

答案 1 :(得分:-1)

这个作品: 但是几乎没有变化:1)你不需要放置Override 2)一旦声明了构造函数和析构函数的定义3)创建派生类的对象并将其传递给列表。

输出为:Inside PlayerCharacter

如果要调用基类更新方法方法,请删除volatile关键字。或者使用指向基类对象的基类指针。

class Entity
{
public:
    Entity();
    ~Entity();
    int hitpoints;
    virtual void Update(void);
};

Entity::Entity()
{
}
Entity::~Entity()
{
}
void Entity::Update(void)
{
    std::cout << " Inside Entity" <<std::endl;
    int a = 0;
    a++;
}
class PlayerCharacter : public Entity
{
public:
    PlayerCharacter();
    ~PlayerCharacter();
    bool Move();
    void Update();
};
void PlayerCharacter::Update(void)
{
    std::cout << " Inside PlayerCharacter" <<std::endl;
    int a = 0;
    a--;
}

PlayerCharacter::PlayerCharacter()
{

}

PlayerCharacter::~PlayerCharacter()
{    

}
int main()
{
    vector<Entity*> list;
    PlayerCharacter ObjPlayerCharacter;
    list.push_back(&ObjPlayerCharacter );

    for(unsigned int i = 0; i < list.size(); i++)
    {
        list[0]->Update();
    }
}