人类精灵网络人Balrog继承
Human Elf Cyberdemon Balrog inheritance
请原谅我没有将不同的文件分开。这是人类精灵的网络网络Balrog分配之一。我的输出是正确的,除了人类和精灵是生物,其名称正确显示,但是Cyberdemon和Balrog是恶魔,其名称显示为恶魔。
我还需要使基类的getPecies()函数成为纯虚拟函数,但这给了我错误。
顺便说一句,我删除了Cyberdemon班的GetDamage()(我应该),并从恶魔到网络秘密纠正了输出。所以我很困惑。
我在做什么错?
#include <iostream>
#include <ctime>
#include <cstdlib>
#include <cstring>
using namespace std;
class Creature
{
private:
int strength;
int hitpoints;
public:
Creature()
{
strength = 10;
hitpoints = 10;
}
Creature(int newStrength, int newHitpoints)
{
strength = newStrength;
newHitpoints = newHitpoints;
}
int getStrength()
{
return strength;
}
int getHitpoints()
{
return hitpoints;
}
void setStrength(int newStrength)
{
strength = newStrength;
}
void setHitpoints(int newHitpoints)
{
hitpoints = newHitpoints;
}
virtual string getSpecies()
{
return "unknownnnnnnnnnnnnnnnnnnnnnnnnnn";
}
int getDamage()
{
int damage;
damage = (rand() % strength) + 1;
cout << "The " << getSpecies() << " attacks for " << damage << " points!" << endl;
return damage;
}
};
class Demon : public Creature
{
public:
Demon()
{
setStrength(10);
setHitpoints(10);
}
Demon(int newStrength, int newHitpoints)
{
setStrength(newStrength);
setHitpoints(newHitpoints);
}
string getSpecies()
{
return "Demon";
}
int getDamage()
{
int damage;
Demon demon(getStrength(), getHitpoints());
damage = Creature::getDamage();
if ((rand() % 100) < 25)
{
damage += 50;
cout << "Demonic attack inflicts 50 additional damage points!" << endl;
}
return damage;
}
};
class Human : public Creature
{
public:
Human()
{
setStrength(10);
setHitpoints(10);
}
Human(int newStrength, int newHitpoints)
{
setStrength(newStrength);
setHitpoints(newHitpoints);
}
string getSpecies()
{
return "Human";
}
/*int getDamage()
{
int damage;
Creature human(getStrength(), getHitpoints());
damage = Creature::getDamage();
return damage;
}*/
};
class Elf : public Creature
{
public:
Elf()
{
setStrength(10);
setHitpoints(10);
}
Elf(int newStrength, int newHitpoints)
{
setStrength(newStrength);
setHitpoints(newHitpoints);
}
string getSpecies()
{
return "Elf";
}
int getDamage()
{
int damage;
Creature elf(getStrength(), getHitpoints());
damage = Creature::getDamage();
if ((rand() % 100) < 50) //elf extra damage chance
{
cout << "nMagical attack inflicts " << damage << " additional damage points!" << endl;
damage = damage * 2;
}
return damage;
}
};
class Cyberdemon : public Demon
{
public:
Cyberdemon()
{
setStrength(10);
setHitpoints(10);
}
Cyberdemon(int newStrength, int newHitpoints)
{
setStrength(newStrength);
setHitpoints(newHitpoints);
}
string getSpecies()
{
return "Cyberdemon";
}
/*int getDamage()
{
int damage;
Demon cyberdemon(getStrength(), getHitpoints());
damage = cyberdemon.getDamage();
return damage;
}*/
};
class Balrog : public Demon
{
public:
Balrog()
{
setStrength(10);
setHitpoints(10);
}
Balrog(int newStrength, int newHitpoints)
{
setStrength(newStrength);
setHitpoints(newHitpoints);
}
string getSpecies()
{
return "Balrog";
}
int getDamage()
{
int damage;
int second_damage;
Demon balrog(getStrength(), getHitpoints());
damage = balrog.getDamage();
second_damage = (rand() % getStrength()) + 1;
cout << "Balrog speed attack inflicts " << second_damage << " additional damage points!n";
damage = damage + second_damage;
return damage;
}
};
int main()
{
srand(time(0));
Human h1;
Elf e1;
Cyberdemon c1;
Balrog b1;
Human h(20, 30);
Elf e(40, 50);
Cyberdemon c(60, 70);
Balrog b(80, 90);
///////////////////////////////////////////////////////////////////////////////////////////
cout << "default Human strength/hitpoints: " << h1.getStrength() << "/" << h1.getHitpoints() << endl;
cout << "default Elf strength/hitpoints: " << e1.getStrength() << "/" << e1.getHitpoints() << endl;
cout << "default Cyberdemon strength/hitpoints: " << c1.getStrength() << "/" << c1.getHitpoints() << endl;
cout << "default Balrog strength/hitpoints: " << b1.getStrength() << "/" << b1.getHitpoints() << endl;
cout << "non-default Human strength/hitpoints: " << h.getStrength() << "/" << h.getHitpoints() << endl;
cout << "non-default Elf strength/hitpoints: " << e.getStrength() << "/" << e.getHitpoints() << endl;
cout << "non-default Cyberdemon strength/hitpoints: " << c.getStrength() << "/" << c.getHitpoints() << endl;
cout << "non-default Balrog strength/hitpoints: " << b.getStrength() << "/" << b.getHitpoints() << endl;
cout << endl << endl;
cout << "Examples of " << h.getSpecies() << " damage: " << endl;
for (int i = 0; i < 10; i++)
{
int damage = h.getDamage();
cout << " Total damage = " << damage << endl;
cout << endl;
}
cout << endl;
///////////////////////////////////////////////////////////////////////////////////////////
cout << "Examples of " << e.getSpecies() << " damage: " << endl;
for (int i = 0; i < 10; i++)
{
int damage = e.getDamage();
cout << " Total damage = " << damage << endl;
cout << endl;
}
cout << endl;
///////////////////////////////////////////////////////////////////////////////////////////
cout << "Examples of " << c.getSpecies() << " damage: " << endl;
for (int i = 0; i < 10; i++)
{
int damage = c.getDamage();
cout << " Total damage = " << damage << endl;
cout << endl;
}
cout << endl;
///////////////////////////////////////////////////////////////////////////////////////////
cout << "Examples of " << b.getSpecies() << " damage: " << endl;
for (int i = 0; i < 10; i++)
{
int damage = b.getDamage();
cout << " Total damage = " << damage << endl;
cout << endl;
}
cout << endl;
/*
Elf e(50,50);
Balrog b(50,50);
battleArena(e, b);
*/
}
查看您的creature
和demon
类之间的差异。特别是在getSpecies()
上,这就是您的问题。
作为经验法则,当使用继承来防止此类错误时,您应始终使用virtual
和override
关键字。它们还使您的代码更具可读性:
class Demon : public Creature
{
public:
....
virtual string getSpecies() override
{
return "Demon";
}
...
};
对您的其他课程做同样的事情,您的代码应按预期工作。
我发现了我的问题。必须从
更改Balrog的课程int getDamage()
{
//......
damage = balrog.getDamage();
//......
}
to
int getDamage()
{
//......
damage = Demon::getDamage();
//......
}
只是一个愚蠢的错误。
相关文章:
- 继承函数的重载解析
- 继承期间显示未知行为的子类
- 头文件-继承c++
- 为什么在保护模式下继承升级不起作用
- 通过继承类使用来自不同命名空间的运算符
- 子目录是否继承属性,例如add_definitions,include_directories和父Cmakelist.t
- 混合组合和继承的C++问题
- 继承:构造函数,初始化C++11中基类的类C数组成员
- 从类继承时,继承的类是否会通过父类重新定义继承的变量
- 公共与私人继承
- 如何创建从同一类继承的不同对象的向量
- 如何从另一个文件继承私有成员变量和公共函数
- 在模板基类中为继承类中的可选重写生成虚拟方法
- 带有继承的C++工厂
- 我应该避免多重实现继承吗
- C++继承更改成员
- 从具有默认值的部分指定模板类继承时发生SWIG错误,具有不带默认值的正向声明
- 关于C++中具有多重继承"this"指针的说明
- 尝试使用继承和模板实现CRTP.Visual Studio正在生成编译器错误
- 人类精灵网络人Balrog继承