简体   繁体   English

虚函数遇到问题(C ++)

[英]Having trouble with virtual functions(C++)

So I made this simple program: 所以我做了一个简单的程序:

#include <iostream>
using namespace std;

class Enemy{
public:
    virtual void attack(){}
    int attackPower;
        void setAttackPower(int a)
        {
            attackPower = a;
        }
};

class Ninja: public Enemy{
public:
    void attack(){
        cout<<"ninja  "<< attackPower<<endl;
    }
};

class Monster: public Enemy{

    public:
    void attack(){
        cout<<"monster  "<< attackPower<<endl;
    }
};


int main()
{
    Ninja n;
    Monster m;
    Enemy *enemy1= &n;
    Enemy *enemy2 = &m;
    enemy1->attack();
    enemy2->attack();
    enemy1->setAttackPower(29);
    enemy2->setAttackPower(99);

    return 0;
}

And the problem I'm having is that when I print out the attack power for like enemy1 it's not what I set it to, 29, its some huge number. 我遇到的问题是,当我像敌人1那样打印出攻击力时,它不是我设定的值29,而是很大的数字。 So what I'm wondering is why is that number huge number occurring and how can I fix it? 因此,我想知道的是为什么会出现这个巨大的数字,我该如何解决呢?

Initialise attackpower first by 首先通过以下方式初始化攻击力

enemy1->setAttackPower(29); enemy2->setAttackPower(99);

Then print them, 然后打印

enemy1->attack(); enemy2->attack();

The main would be like main会是

int main()
{
    Ninja n;
    Monster m;
    Enemy *enemy1= &n;
    Enemy *enemy2 = &m;

    enemy1->setAttackPower(29); // set the attack power first
    enemy2->setAttackPower(99);
     enemy1->attack();          // then print it otherwise junk values will be printed
    enemy2->attack();
    return 0;
}

You called attack() before setAttackPower() . 你所谓的attack()之前setAttackPower() Because you did not initialize either m or n , they have garbage values. 因为您没有初始化mn ,所以它们具有垃圾值。

It's been a quite a while since I wrote any C++ but does this code: 自从我编写任何C ++以来已经有一段时间了,但是执行以下代码:

void attack(){
    cout<<"monster  "<< attackPower<<endl;
}

also need to the virtual keyword: 还需要虚拟关键字:

virtual void attack(){
    cout<<"monster  "<< attackPower<<endl;
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM