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

Having issue using inherited protected member (C++)

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

#ifndef SOLDIER_H
#define SOLDIER_H

#include <iostream>

class Soldier{
protected:
    const int m_damage;
public:
    Soldier():
        m_damage(5)
    {}
};

#endif // SOLDIER_H

这是我的 Warrior class,继承自它:

#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;

在士兵class中受保护,在战士class中公开继承,我仍然无法访问它。任何帮助将不胜感激。

是真的Warrior没有成员m_damage。它属于Soldier,只有Soldier可以初始化它。

您应该允许 Soldier 的构造函数将 damage 参数作为参数,并在构造基础 类 时将您想要的 m_damage 值传递给它。

#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';
}