人类精灵网络人Balrog继承

Human Elf Cyberdemon Balrog inheritance

本文关键字:Balrog 继承 网络 精灵 人类      更新时间:2023-10-16

请原谅我没有将不同的文件分开。这是人类精灵的网络网络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);
    */
    }

查看您的creaturedemon类之间的差异。特别是在getSpecies()上,这就是您的问题。

作为经验法则,当使用继承来防止此类错误时,您应始终使用virtualoverride关键字。它们还使您的代码更具可读性:

class Demon : public Creature
{
public:
      ....
      virtual string getSpecies() override
      {
        return "Demon";
      }
     ...
};

对您的其他课程做同样的事情,您的代码应按预期工作。

我发现了我的问题。必须从

更改Balrog的课程
int getDamage()
{
    //......        
    damage = balrog.getDamage();
    //......
}

to

int getDamage()
{
    //......          
    damage = Demon::getDamage();
    //......
}

只是一个愚蠢的错误。