我是C ++的新手,我很难弄清楚我的虚拟功能有什么问题。所以,这就是我所拥有的:
的 GEntity.h
class GEntity
{
public:
//...
virtual void tick(void);
virtual void render(void);
//...
};
GEntity.cpp
//...
void GEntity::tick(void){}
void GEntity::render(void){}
//...
GLiving.h
class GLiving : public GEntity
{
public:
//...
virtual void tick(void);
virtual void render(void);
//...
};
GLiving.cpp
//...
void GEntity::tick(void){}
void GEntity::render(void){}
//...
然后我有其他类派生自GLiving(Player,Enemy),它们实现了这两种方法的自己版本: 的 Player.h
class Player : public GLiving
{
public:
//...
void tick(void);
void render(void);
//...
};
Player.cpp
//...
void GEntity::tick(void)
{
//Here there's some actual code that updates the player
}
void GEntity::render(void)
{
//Here there's some actual code that renders the player
}
//...
现在,如果我声明类Player的对象,并调用render / tick方法,一切顺利,但我处于这样一种情况:我将我的播放器添加到GEntity的arraylist(我创建的结构),然后,当我得到它时,我得到它作为一个GEntity,我需要调用render / tick方法而不知道它的派生类...
我已尝试使用上面的代码,但是我在提取的GEntity上调用了render或tick方法的行中出现了访问冲突...
...是我想要的甚至可能实现的目标?
(对不起,如果我的英语不太好,但我是意大利语)
答案 0 :(得分:3)
如果你有一个GEntity
的数组,那么,每当你“添加”一个派生类型时,都会发生这种情况:
GEntity g;
Player p;
g = p; // object slicing, you assigned a Player to a GEntity object.
g.render(); // GEntity::render() gets called
另一方面,您可以使用指向基类的指针来访问派生方法:
GEntity* g;
Player p;
g = &p;
g->render(); // calls Player::render()
因此,处理容器中的多态性的方法是拥有指向基类的(最好是智能)指针的数组/容器。此示例使用原始指针以简化,但您应该在实际代码中使用smart pointers:
std::vector<CEntity*> entities;
entities.push_back(new Player);
entities.push_back(new GLiving);
// some c++11
for ( auto e : entities) {
e->render();
}