为什么不调用虚函数?

时间:2011-01-03 14:42:18

标签: c++

//GUITEXT
class guitext : public entity {
public:
    guitext(graphics *gfx, std::string _text, float _x, float _y, 
        float _size, float timeToLive);
    bool update(float deltaTime, gameworld *world);
    void draw(graphics *gfx);
};

void guitext::draw(graphics *gfx) { printf("draw"); }

//ENTITY

class entity {
public:
    virtual bool update(float deltaTime, gameworld *world) 
        { return false; }
    virtual void draw(graphics *gfx) { }
};

//GAMEWORLD

void gameworld::addEntity(entity e) { entitys.push_back(e); }

//MAIN 

for(int i = 0; i < (int)entitys.size(); i++) { entitys[i].draw(gfx); }

我的gameworld课程中有一个向量。当我向这个向量添加一个guitext实体时,我希望它能调用guitext :: draw()函数。但是正在调用基类函数。我做错了什么?

6 个答案:

答案 0 :(得分:6)

你制作了entity的向量。那些总是的对象具有类型entity。如果要调用多态,则需要指针或引用。 entity的向量如何存储guitext?没有足够的空间,它不知道如何破坏它等等。

答案 1 :(得分:4)

向量是否声明为vector<entity>?那么只有基类部分可以存储在那里,即你失去了多态性(只能通过C ++中的指针或引用)。

答案 2 :(得分:4)

你所做的是slicing.

的隐蔽变体

答案 3 :(得分:0)

您应该定义entitys以包含指向entity的指针。从您的代码中衍生出来的略有编辑的示例。

#include "stdafx.h"
#include <vector>
#include <string>

class entity 
{
public:
    virtual void draw() { }
};

class guitext : public entity 
{
public:
    void draw()
    {
        printf("draw");
    }
};

int _tmain(int argc, _TCHAR* argv[])
{
    std::vector<entity *> entitys;

    guitext g;

    entitys.push_back(&g); 

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

    return 0;
}

答案 4 :(得分:0)

您正在存储Entity,而不是指向不同派生类型Entity的对象的指针。

答案 5 :(得分:0)

另外,在你的情况下,按值传递参数不是一个好主意,我想会有很多需要重绘的对象。更好,通过const引用,因为functon不会改变内部传递对象的状态。