使用继承的受保护成员(C )发行问题



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

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

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

是正确的 Warrior没有成员m_damage。它属于Soldier,只有Soldier才能初始化它。

您应该允许Soldier s构造器将损坏参数作为参数,并在构造基本类时将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';
}

最新更新