分配派生类的对象时出现问题,其中基类具有抽象虚函数

Problems Allocating Objects of Derived Class Where Base Class has Abstract Virtual Functions

本文关键字:基类 函数 抽象 问题 派生 对象 分配      更新时间:2023-10-16

我正在尝试运行这个基于僵尸/人类代理的模拟,但是我遇到了这些具有父类"生物"的派生类(人类和僵尸)的问题。我在"生物"中声明了 3 个虚拟函数,这三个函数都在"人类"和"僵尸"中重新声明和定义。但是出于某种原因,当我的程序调用"new"为人类或僵尸类型的对象分配内存时,它抱怨虚拟函数是抽象的。代码如下:

页眉:

class Creature
{          
public:
      virtual void Attack(Grid G) =0;
      virtual void AttackCreature(Grid G, int attackdirection) =0;
      virtual void Breed(Grid G) =0;
      virtual ~Creature() {}          
      void Die();
      void Move(Grid G);
      int DecideSquare(Grid G);
      void MoveTo(Grid G, int dir);           
};
class Human : public Creature 
{
public:          
      void Attack(Grid G);
      void AttackCreature(Grid G, int attackdirection);
      void Breed(Grid G); //will breed after x steps and next to human          
      int DecideAttack(Grid G);
};
class Zombie : public Creature
{
   public:
      void Attack(Grid G); 
      void AttackCreature(Grid G, int attackdirection);
      void Breed(Grid G) {} //does nothing  
      int DecideAttack(Grid G);
};

.cpp:

void Creature::Move(Grid G) {...}
int Creature::DecideSquare(Grid G) {...}
void Creature::MoveTo(Grid G, int dir) {...}
void Creature::Die() {...}
void Human::Breed(Grid G) {...}   
int Human::DecideAttack(Grid G) {...}
void Human::AttackCreature(Grid G, int attackdirection) {...}
int Zombie::DecideAttack(Grid G) {...}
void Zombie::AttackCreature(Grid G, int attackdirection) {...}
void Zombie::Attack(Grid G) {...}

Creature中:

virtual void Breed() =0;

Human

void Breed(Grid G);

这些是不同的功能;后者不会覆盖前者。使纯虚函数Creature采用正确的参数。

对于Attack()也是如此。

声明了一个纯虚函数:virtual void Creature::Attack(Grid G)但没有实现派生类Human,即没有定义void Human::Attack(Grid G)方法,这就是我收到vtable错误的原因。它找不到我承诺的功能的源代码。坏我!