我对保护变量有疑问。也许我并没有真正了解它们,但是没有理由使用它们,那些子类可以使用它们吗?总的来说,我希望降低生命值。
这是我的代码: 头文件
class Fighter {
protected:
int offensePoints;
int defensePoints;
int lifepoints;
std::string name;
public:
Fighter(const std::string n);
virtual ~Fighter();
virtual void attackFighter(Fighter * f);
int randomval(int min, int max);
bool isalive();
void isattacked(Fighter * at, int dmg);
};
class Warrior : public Fighter
{
public:
Warrior(const std::string n);
virtual ~Warrior();
void attackFighter(Fighter * f);
int randomval(int min, int max);
bool isalive();
void isattacked(Fighter * at, int dmg);
};
战斗机:
void Fighter::attackFighter(Fighter * f)
{
if (isalive())
{
f->lifepoints -= randomval(0, offensePoints);
}
}
战士
void Warrior::attackFighter(Fighter * f)
{
if (isalive())
{
f->lifepoints -= randomval(0, offensePoints);
}
}
答案 0 :(得分:-1)
您只能访问类型实例中的受保护成员(或从您的类型派生)。 您无法访问父级或堂兄类型的实例的受保护成员。 在您的情况下,Derived类只能访问Derived实例的b成员,而不能访问其他Base实例。 更改构造函数以获取Derived实例也将解决问题。
找到Accessing protected members in a derived class。
在您的情况下,这意味着您无法访问战斗机的生命点,只能访问战士。
嗯这可行,但我想这不是你想做的事情:
void Warrior::attackFighter(Warrior* w)'
另一个解决方案是在战士的攻击中调用战斗机的功能攻击战士
void Warrior::attackFighter(Fighter * f)
{
Fighter::attackFighter(f);
}
您可以设法更改Fighter::attackFighter
的行为,例如:
void Warrior::attackFighter(Fighter * f)
{
Fighter::attackFighter(f);
Fighter::attackFighter(f); // This way, a warrior would attack twice when a simple fighter would only attack once.
}
这不是很微妙,但我相信你明白了避免问题的不同可能性。