【问题标题】:overriding static methods in C++覆盖 C++ 中的静态方法
【发布时间】:2020-11-03 18:28:56
【问题描述】:

我有一个基类Character,可以Attack(),以及派生类Magician(10)、Elf(5) 或Giant(15)。 魔术师可以进化到BlackMagician(15)

Character 的每种类型都有一个已定义的Power(在括号中)。我的问题是如何将一个类与一个静态函数 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; }
};

【问题讨论】:

  • 请显示代码,而不是仅仅描述它。
  • 我不知道我是否做对了,但在我看来,您要么希望 Character.Attack() 是虚拟的,要么拥有一个由您的派生设置的 Character::power 成员类并由 Character.Attack() 使用。
  • 你只能覆盖一个虚函数,所以没有静态的。
  • 没有参数的静态函数应该如何知道使用的是哪个实例?
  • @Surt 他说的是覆盖,而不是重载

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


【解决方案1】:

只有virtual 方法可以被覆盖。但是static 方法不能是virtual,因为它没有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; }
};

【讨论】:

  • 那么,我可以使用“return myStaticVar”的变量
  • 我根据你的添加了代码,谢谢,请查看问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-06-21
  • 2010-10-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多