我有一个基类Character
,可以Attack()
,以及派生类Magician
(10)、Elf
(5) 或巨人
(15)。
魔术师可以进化为BlackMagician
(15)
每种类型的角色
都有一个定义的力量
(在括号中)。我的问题是如何将类与静态函数 getFamilyPower()
关联起来并相应地覆盖它。
代码如下: https://codecollab.io/@sdudnic/warriors
想法如下:
class Character {
static int power;
public:
static int getPower() { return power; }
virtual int Attack(Character *other) { /*...*/ }
};
class Magician : public Character {
static int power = 10;
public:
static int getPower() {return power; }
};
class Elf : public Character {
static int power = 5;
public:
static int getPower() {return power; }
};
class Giant : public Character {
static int power = 15;
public:
static int getPower() {return power; }
};
最佳答案
只有虚拟
方法可以被重写。但是静态
方法不能是虚拟
,因为它没有this
实例指针来访问vtable。因此,每个Character
都需要一个非静态virtual
方法来报告其当前的功率级别,例如:
class Character
{
public:
int health = 100;
void Attack(Character *other) {
int myPower = Power();
int theirPower = other->Power();
if (theirPower > myPower)
health -= theirPower;
else if (theirPower < myPower)
other->health -= myPower;
}
virtual int Power() = 0;
virtual void Evolve() {}
};
class Magician : public Character
{
public:
bool isBlack = false;
int Power() override { return isBlack ? 15 : 10; }
void Evolve() override { isBlack = true; }
};
class Elf : public Character
{
public:
int Power() override { return 5; }
};
class Giant : public Character
{
public:
int Power() override { return 15; }
};
关于c++ - 重写 C++ 中的静态方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64668525/