gpt4 book ai didi

c++ - 从基类 C++ 调用虚方法

转载 作者:太空狗 更新时间:2023-10-29 21:25:43 26 4
gpt4 key购买 nike

我是 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 的数组列表(我创建的结构)的情况,然后,当我取回它时,我将它作为 GEntity 获取,并且我需要在不知道它是派生类的情况下调用渲染/刻度方法...我已经尝试使用上面的代码,但是在提取的 GEntity 上调用 render 或 tick 方法的行中出现访问冲突...
...我想要的是什至可以实现的吗?
(对不起,如果我的英语不太好,但我是意大利人)

最佳答案

如果您有一个 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();
}

关于c++ - 从基类 C++ 调用虚方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13518631/

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