我正在编写一个编程任务,我们正在学习多态。我们正在使用父母和子女班制作一个简单的格斗游戏。
基本结构如下:
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类中访问这个新的变更变量?
谢谢!
答案 0 :(得分:0)
Monster
和Ninja
是两个不同的类。显示的代码初始化两个不同的对象。这两个对象完全相互独立。 Ninja
类的构造函数及其ninjaAttack()
方法初始化并修改其中一个对象的life
。
在第二个对象上调用monsterAttack()
方法以打印它的life
成员,但该对象与Ninja
对象的life
对象完全无关。 1}}递减到3. Monster
的{{1}}从未初始化,并且打印其值会导致未定义的行为。 0的输出是这种未定义行为的可能结果。
答案 1 :(得分:-1)
一些评论:
monsterLife
,但您定义了monsterAttack
Ninja
和Monster
是私有的,因此您无法直接调用它回到你的问题,我认为你可以使用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;
}