无法访问指针Parent类的protected int变量

时间:2017-05-05 14:18:00

标签: c++ variables protected

我对保护变量有疑问。也许我并没有真正了解它们,但是没有理由使用它们,那些子类可以使用它们吗?总的来说,我希望降低生命值。

这是我的代码: 头文件

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);
    }
}

1 个答案:

答案 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.
}

这不是很微妙,但我相信你明白了避免问题的不同可能性。