【问题标题】:Constructing derived class from inherited variables从继承的变量构造派生类
【发布时间】:2016-05-23 07:08:26
【问题描述】:

也许标题有点混乱,所以我会尽力确保它尽可能清晰。

基本上,我正在尝试创建一个游戏,其中有一个名为“Creature”的抽象基类,并且在它下面有几个派生的幻想生物类。

现在我的问题是:

如果我有一个基类,它具有受保护的变量 intstrength 和 int Armor,我如何使用 intstrength 和 int Armor 构造派生类,以便它们获得自己的值,而无需在该类中实际定义强度和盔甲变量?

让我编写我想要实现的代码。

class Creature
{
  public:
    Creature();
  private:
    int armor;
    int strength;
};

class Human: public Creature
{
   public:
      Human(int a, int b): armor(a), strength(b)
      {
      }
};

int main() 
{ 
  Human Male(30, 50);
  cout << Male.armor;
  cout << Male.strength;
  return 0;
}

我该怎么做?我需要在第一类中拥有盔甲和力量,所以我不能在每个派生类中声明它。

感谢任何帮助。谢谢!

【问题讨论】:

    标签: c++ class inheritance constructor polymorphism


    【解决方案1】:

    您可以在基类中创建一个以str和armor为参数的构造函数,然后将它们传递给派生类的构造函数中的基构造函数。

    class Creature
    {
      public:
        Creature(int a, int s) : armor(a), strength(s) {};
    
    protected:
        int armor;
        int strength;
    };
    
    class Human: public Creature
    {
       public:
          Human(int a, int s) : Creature(a, s) {}
    };
    

    注意:如果只希望派生类构造Creature,则可以将Creature 构造函数设为protected

    如果你想访问 armour 和 str 值,你必须添加 getter 函数,因为 armour 和strength 是受保护的成员变量。

    class Creature
    {
      public:
        Creature(int a, int s) : m_armor(a), m_strength(s) {};
    
        int armor() const     { return m_armor; }
        int strength() const  { return m_strength; }
    
    protected:
        int m_armor;
        int m_strength;
    };
    

    现在你可以拥有你的 main() 函数了:

    int main() 
    { 
      Human Male(30, 50);
      cout << Male.armor();
      cout << Male.strength();
      return 0;
    }
    

    【讨论】:

      【解决方案2】:

      允许在基类的构造函数中设置这些变量:

      class Creature
      {
        public:
          Creature();
        protected:
          Creature(int armor_, int strength_) : armor(armor_), strength(strength_){}        
      
          int armor;
          int strength;
      };
      

      现在在派生类中,只需将这些传递给基类:

      Human(int armor_, int strength_) : Creature(armor_, strength_){}     
      

      【讨论】:

      • 太棒了。非常感谢!
      【解决方案3】:

      首先,确保基类有一个可以正确初始化其成员变量的构造函数。

      class Creature
      {
        public:
      
            Creature(int a, int b): armor(a), strength(b) {}
      
        private:
          int armor;
          int strength;
      };
      

      除非派生类有其他成员数据需要初始化,否则你可以使用下面的构造来像在派生类中定义的那样使用基类构造函数。

      class Human: public Creature
      {
         public:
            using Creature::Creature;
      };
      

      现在你可以使用了:

      int main() 
      { 
        Human Male(30, 50);
        return 0;
      }
      

      使用

      cout << Male.armor;
      cout << Male.strength;
      

      不正确,因为armorstrengthprivateCreature 成员变量。您应该添加几个访问器函数并使用它们。

      class Creature
      {
         public:
         ...
      
         int getArmor() const { return armor; }
         int getStrength() const { return strength; }
      

      然后将它们用作:

      cout << Male.getArmor();
      cout << Male.getStrength();
      

      【讨论】:

      • 对不起,应该是被保护的!不过谢谢你的建议。
      猜你喜欢
      • 2012-12-19
      • 1970-01-01
      • 2015-11-03
      • 1970-01-01
      • 1970-01-01
      • 2013-04-05
      • 2019-10-01
      • 2018-06-06
      • 2014-03-07
      相关资源
      最近更新 更多