函数中的指针不称为派生类的重写函数

Pointer in a function is not called the derived class's overridden function

本文关键字:函数 派生 重写 指针      更新时间:2023-10-16

在我的CS课程简介中,我们制作了一个简短的游戏,不同的角色必须相互战斗(攻击点和防御点是通过掷一定数量的骰子产生的)。其中一个角色是影子,它覆盖了基类防御功能,以产生50%的不被击中的机会。我单独测试了被覆盖的函数,它有效,但当我在战斗函数中调用它时,它只是使用了基类版本的防御,尽管扮演的角色是影子。有什么想法吗?我怀疑这与指针有关。是的,基类防御函数被声明为虚拟的。

更新:这是基类和影子类——我删除了与问题无关的成员数据和函数。

  //The Character Class
   class Character
  {
    protected:
    Dice AttackDie;
    Dice DefenseDie;
public:
    //The Constructor
    Character(string,int,int,int,int,int,int);
    virtual int attack();
    virtual int defend() const;   //I've tested it with and without const, it still doesn't work
    int getSP();   //StrengthPoints Accessor
    string getName();
    friend void combat(Character, Character);  
};
//Shadow subclass
class Shadow: public Character
{
   //Will override defense
    public:
    Shadow(string,int,int,int,int,int,int);
    //Override the defense function
    int defend() const;
};
 void Combat(Character char1, Character char2)
{
    //Set up the players so that they can alternate
    Character* player1 = &char1;
    Character* player2 = &char2;
    //While loop for combat;
   while (char1.getSP() > 1 || char2.getSP() > 1)   //Play until a character dies
   {
      //Variables for combat
      int attacksum = 0;
      int defensesum = 0;
      int result = 0;
      int damage = 0;
      int hurt = 0;
      attacksum = player1->attack(); //Generate attack value
      //Generate Attack Points
      cout << player1->getName() << " attack points are " << attacksum <<   endl;
    //Generate Defense Points --- This does not call the overriden function when player2 is a Shadow
      defensesum = player2->defend();    //Generate defense value
    //Display the defeense
      cout << player2->getName() << " defense points are " << defensesum << endl;
}

确保方法签名相同(返回值相同,参数相同),并确保函数标记为虚拟。

你可以使用这里发布的想法来解决一些问题:

安全覆盖C++虚拟函数

或者为了进一步的故障排除,你可以把你的基本方法写为:

virtual void baseMethod()=0;

如果您没有正确地重写它,那么编译器应该抛出一个错误。