c++ - 重写 C++ 中的静态方法

标签 c++ overriding static-methods static-members

我有一个基类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/

相关文章:

c++ - 如果需要创建一个 ofstream

c++ - 如何声明 boost 范围适配器(例如 map_values)

Android ListView : overriding causes scrolling do not executed

c++ - 使用套接字c++ eclipse删除数组

c++ - 我们可以有一个静态的虚函数吗?如果不是,那为什么?

c++ - 错误修复。 OpenGL、GLSL Sprite 网格渲染问题

c++ - 重载运算符的返回类型 + 表现出奇怪的行为

css - BEM:如何确保 block 中的 CSS 值覆盖另一个 block 中定义的属性?

java - 从java中的线程池运行静态方法

c# - 如何隐藏静态方法