代码之家  ›  专栏  ›  技术社区  ›  Scratch Cat

使用继承的受保护成员时出现问题(C++)

  •  0
  • Scratch Cat  · 技术社区  · 7 年前

    这是我遇到的问题。这是我的士兵课:

    #ifndef SOLDIER_H
    #define SOLDIER_H
    
    #include <iostream>
    
    class Soldier{
    protected:
        const int m_damage;
    public:
        Soldier():
            m_damage(5)
        {}
    };
    
    #endif // SOLDIER_H
    

    这是我的战士职业,继承自它:

    #ifndef WARRIOR_H
    #define WARRIOR_H
    
    #include "Soldier.h"
    
    class Warrior: public Soldier{
    public:
        Warrior():
            m_damage(10)
        {}
    };
    
    #endif // WARRIOR_H
    

    问题是,当我运行程序时,会出现以下错误:

    Warrior.h: In constructor 'Warrior::Warrior()':
    Warrior.h:9:9: error: class 'Warrior' does not have any field named 'm_damage'
             m_damage(10)
    

    看起来,虽然我

    const int m_damage;
    

    1 回复  |  直到 7 年前
        1
  •  3
  •   Paul Rooney    7 年前

    这是真的 Warrior 没有成员 m_damage Soldier 只有 士兵

    你应该允许 s构造函数将损坏参数作为参数,并传递所需的值 m_损坏

    #include <iostream>
    
    class Soldier{
    protected:
        const int m_damage;
    public:
        // explicit will prevent implicit conversions from 
        // being permitted when constructing Soldier
        // see http://en.cppreference.com/w/cpp/language/explicit
        explicit Soldier(int damage=5):
            m_damage(damage)
        {}
    
        int damage() const
        {
            return m_damage;
        }
    };
    
    class Warrior: public Soldier{
    public:
        Warrior()
            :  Soldier(10)
        {}
    };
    
    // lets make another subclass which implicitly uses the 
    // default Soldier constructor.
    class Samurai: public Soldier{
    public:
        Samurai()
        {}
    };
    
    int main(){
        Warrior w;
        Samurai s;
    
        std::cout << w.damage() << '\n';
        std::cout << s.damage() << '\n';
    }