虚函数——架构问题
Posted
技术标签:
【中文标题】虚函数——架构问题【英文标题】:Virtual functions - architecture question 【发布时间】:2020-07-16 12:04:52 【问题描述】:我有:
class Game
;
class Zombie :public Game
public:
virtual int getHP() const=0;
;
class Zombiesmall : public Zombie
int HPy=30;
public:
int getHP() const;
;
class Zombiebig : public Zombie
int HPz=20;
public:
int getHP() const;
;
class Player : public Game
int hpk=100;
public:
int getHPK() const;
;
class Barrel: public Game
;
我的讲师说,函数getHP
和getHPK
同时存在是没有意义的,所以他让我改变它,他建议在Game
类中创建一个函数,所以我假设他要我在Game
课堂上做virtual
功能。我这样做了,但我的问题是,如果我在类 Barrel 中根本不需要这个函数,这样做是否有意义,但是通过创建虚函数让我无论如何都要在 Barrel
中编写 a 定义,我赢了永远不要使用它。
【问题讨论】:
这个问题恐怕太抽象了,无法回答。类名完全没有告诉我们它们的目的。我的猜测是K
应该继承自 X
并且所有这些 getHP()
覆盖都没有用(X
中应该只有一个 int HP
成员,并且该类应该实现 getHP()
),但我对你的用例一无所知,也不知道你为什么选择这样做。
我编辑了帖子,sr
鉴于您的问题内容,您甚至可能不需要为僵尸和玩家设置不同的类。只需要一个类来处理具有 hp 的东西并用正确的数字实例化它(例如,100 代表玩家,20 代表僵尸等等)。不需要从空的Game
类继承,也不需要从多态函数继承。尝试找出“类型的不同实例”和“不同类型”之间的区别。 (附带说明,在 99% 的情况下,如果你的类有任何虚函数,它应该有一个虚析构函数。)
@Yksisarvinen 好双关语:P
随机 - 确保您的基本类型具有虚拟析构函数。你也应该看看为什么。
【参考方案1】:
这里有一个应该有帮助的继承树:
Entity (renamed your Game)
<- Creature (with getHP())
<- Player (one of the implementations)
<- Zombie
<- SmallZombie
<- BigZombie
<- Barrel (without getHP())
在 C++ 中:
class Entity // base for other classes
public:
virtual ~Entity() = default;
;
class Creature : public Entity // has getHP()
public:
virtual int getHP() const = 0;
;
class Player : public Creature // is-a Creature => must implement getHP()
private:
int hp = 100;
public:
int getHP() const override
return hp;
;
// similar for zombies
class Barrel : public Entity // not a Creature => doesn't have getHP()
;
【讨论】:
以上是关于虚函数——架构问题的主要内容,如果未能解决你的问题,请参考以下文章