使用继承的受保护成员 (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';
}
这是我遇到的问题。这是我的士兵 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';
}