我不确定如何访问不同子类中的变量

时间:2017-02-20 01:08:28

标签: c++

我正在编写一个编程任务,我们正在学习多态。我们正在使用父母和子女班制作一个简单的格斗游戏。

基本结构如下:

class Parent
{
protected:
    int life;
};

class Ninja : public Parent
{
private:
     Ninja (int x);
     void ninjaAttack ();
};

Ninja::Ninja (int x) : Parent ()
{
life = x;
}

Class Monster : public Parent
{
private:
     Monster ();
     void monsterLife ();
};

Monster::Monster() : Parent()
{
}

void Ninja::ninjaAttack ()
{
     life = (life-1);
}

void Monster::monsterAttack()
{
cout << life << endl;
}

int main ()
{
    Ninja n1 (4);
    Monster m2;

    Parent * p1 = &n1;
    Parent * p2 = &m1;

    p1 -> ninjaAttack();
    p2 -> monsterAttack();

    return 0;
}

基本上,通过初始化Ninja,我应该让Parent :: life = 4,对吗?然后通过运行ninjaAttack,我将'生命'降低到3.然后通过调用monsterAttack,我应该输出3,是吗?

除非它不起作用。它每次都输出零。我究竟做错了什么?如果我将Parent类中的变量设置为等于Child类中的某个变量,那么如何才能实际更改Parent类中的变量,以便可以在Child类中访问这个新的变更变量?

谢谢!

2 个答案:

答案 0 :(得分:0)

MonsterNinja是两个不同的类。显示的代码初始化两个不同的对象。这两个对象完全相互独立。 Ninja类的构造函数及其ninjaAttack()方法初始化并修改其中一个对象的life

在第二个对象上调用monsterAttack()方法以打印它的life成员,但该对象与Ninja对象的life对象完全无关。 1}}递减到3. Monster的{​​{1}}从未初始化,并且打印其值会导致未定义的行为。 0的输出是这种未定义行为的可能结果。

答案 1 :(得分:-1)

一些评论:

  • 您声明了monsterLife,但您定义了monsterAttack
  • 两个构造函数NinjaMonster是私有的,因此您无法直接调用它

回到你的问题,我认为你可以使用static变量。例如,

#include <iostream>

using namespace std;

class Parent
{
protected:
    static int life;
};

int Parent::life = 0;

class Ninja : public Parent
{
public:
     Ninja (int x);
     void ninjaAttack ();
};

Ninja::Ninja (int x) : Parent ()
{
    Parent::life = x;
}

class Monster : public Parent
{
public:
     Monster ();
     void monsterLife ();
};

Monster::Monster() : Parent()
{
}

void Ninja::ninjaAttack ()
{
    Parent::life = Parent::life-1;
}

void Monster::monsterLife()
{
    cout << Parent::life << endl;
}

int main ()
{
    Ninja n1 (4);
    Monster m2;

    n1.ninjaAttack();
    m2.monsterLife();

    return 0;
}