分配派生类的对象时出现问题,其中基类具有抽象虚函数
Problems Allocating Objects of Derived Class Where Base Class has Abstract Virtual Functions
我正在尝试运行这个基于僵尸/人类代理的模拟,但是我遇到了这些具有父类"生物"的派生类(人类和僵尸)的问题。我在"生物"中声明了 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
错误的原因。它找不到我承诺的功能的源代码。坏我!
相关文章:
- 虚拟基类函数中派生类的大小
- 无法访问基类函数 C++
- 如何使派生类函数在调用时始终调用相同的基类函数?
- C++虚拟函数:基类函数是调用的,而不是派生的
- Qt基类函数定义
- 添加字符串类型的类成员会导致调用基类函数而不是子函数
- 有没有办法调用基类函数,该函数在使用私有继承的派生类中被覆盖?
- C++ - 基类函数指针调用的替代方法
- 什么更有效率?在重载函数中或通过在基类函数中检查对象类型来实现
- 重载基类函数是不好的做法吗?
- 在 qml 中公开基类函数
- 调用基类函数时强制使用类名?
- 如何判断哪个派生的类对象称为基类函数
- 获取具有基类函数的派生类
- 有没有办法从基类函数参数中推断出模板参数
- 私有非虚拟基类函数被称为派生类中的函数
- 模板基类函数成员的别名
- 如何用相同的签名从main调用基类函数
- C++ 如何从 main 调用派生的基类函数
- memcpy派生类到基类,为什么还调用基类函数