虚函数——架构问题

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

    
;

我的讲师说,函数getHPgetHPK同时存在是没有意义的,所以他让我改变它,他建议在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()
;

【讨论】:

以上是关于虚函数——架构问题的主要内容,如果未能解决你的问题,请参考以下文章

虚函数和基类中的this指针的问题!

请问关于c++虚函数的问题

C++中的虚函数以及虚函数表

虚函数与纯虚函数

虚函数纯虚函数虚函数与析构函数

c++虚函数问题,大神请进