C++ - 更改 class 以使用虚函数
C++ - Changing class to use virtual functions
我希望提高效率,我如何 Re-write 敌人 class 使用继承和虚函数?包括任何新的 child classes.
class Enemy
{
public:
int type; // 0 = Dragon, 1 = Robot
int health; // 0 = dead, 100 = full
string name;
Enemy();
Enemy(int t, int h, string n);
int getDamage(); // How much damage this enemy does
};
Enemy::Enemy() : type(0), health(100), name("")
{ }
Enemy::Enemy(int t, int h, string n) :
type(t), health(h), name(n)
{ }
int Enemy::getDamage() {
int damage = 0;
if (type == 0) {
damage = 10; // Dragon does 10
// 10% change of extra damage
if (rand() % 10 == 0)
damage += 10;
}
else if (type == 1) {
// Sometimes robot glitches and does no damage
if (rand() % 5 == 0)
damage = 0;
else
damage = 3; // Robot does 3
}
return damage;
}
这会计算乐队将造成多少总伤害。
int calculateDamage(vector<Enemy*> bandOfEnemies)
{
int damage = 0;
for (int i = 0; i < bandOfEnemies.size(); i++)
{
damage += bandOfEnemies[i]->getDamage();
}
return damage;
}
这是一个好的开始,但是有了继承,您就不需要那么具体了。例如,在敌人 class 中你有一个属性 type
。如果要使用继承,则不需要指定 type
,因为派生的 class 将是 type
.
至于你的函数getDamage()
,你可以留空,改成虚函数。将所有这些放在一起,您的代码应如下所示:
class Enemy
{
public:
int health; // 0 = dead, 100 = full
string name;
Enemy();
Enemy(int t, int h, std::string n);
virtual int getDamage() = 0; // pure virtual function
};
Enemy::Enemy()
: type(0), health(100), name("") {}
Enemy::Enemy(int t, int h, std::string n)
: type(t), health(h), name(n) {}
// class 'Dragon' inherits from class 'Enemy'
class Dragon : public Enemy
{
public:
Dragon() {}
int getDamage()
{
// dragon's damage
}
};
注意如果你想创建另一个敌人,你只需继承 Enemy
class。这样,您就可以将字符存储在这样的数组中:
vector<Enemy> enemies = {
Dragon(),
Dragon(),
Robot()
};
我希望提高效率,我如何 Re-write 敌人 class 使用继承和虚函数?包括任何新的 child classes.
class Enemy
{
public:
int type; // 0 = Dragon, 1 = Robot
int health; // 0 = dead, 100 = full
string name;
Enemy();
Enemy(int t, int h, string n);
int getDamage(); // How much damage this enemy does
};
Enemy::Enemy() : type(0), health(100), name("")
{ }
Enemy::Enemy(int t, int h, string n) :
type(t), health(h), name(n)
{ }
int Enemy::getDamage() {
int damage = 0;
if (type == 0) {
damage = 10; // Dragon does 10
// 10% change of extra damage
if (rand() % 10 == 0)
damage += 10;
}
else if (type == 1) {
// Sometimes robot glitches and does no damage
if (rand() % 5 == 0)
damage = 0;
else
damage = 3; // Robot does 3
}
return damage;
}
这会计算乐队将造成多少总伤害。
int calculateDamage(vector<Enemy*> bandOfEnemies)
{
int damage = 0;
for (int i = 0; i < bandOfEnemies.size(); i++)
{
damage += bandOfEnemies[i]->getDamage();
}
return damage;
}
这是一个好的开始,但是有了继承,您就不需要那么具体了。例如,在敌人 class 中你有一个属性 type
。如果要使用继承,则不需要指定 type
,因为派生的 class 将是 type
.
至于你的函数getDamage()
,你可以留空,改成虚函数。将所有这些放在一起,您的代码应如下所示:
class Enemy
{
public:
int health; // 0 = dead, 100 = full
string name;
Enemy();
Enemy(int t, int h, std::string n);
virtual int getDamage() = 0; // pure virtual function
};
Enemy::Enemy()
: type(0), health(100), name("") {}
Enemy::Enemy(int t, int h, std::string n)
: type(t), health(h), name(n) {}
// class 'Dragon' inherits from class 'Enemy'
class Dragon : public Enemy
{
public:
Dragon() {}
int getDamage()
{
// dragon's damage
}
};
注意如果你想创建另一个敌人,你只需继承 Enemy
class。这样,您就可以将字符存储在这样的数组中:
vector<Enemy> enemies = {
Dragon(),
Dragon(),
Robot()
};