我似乎遇到了继承问题。每当我尝试覆盖我的Character.cpp文件中的函数时,我都会收到一条错误,指出:“类字符没有默认构造函数”。我对c ++很新,我不明白错误出现的原因。我想要做的是基本上覆盖默认Character类的GetFierceAttack()对于被称为Ogre的子类更强。我想知道我是否正确使用'虚拟'。
我的Character.h文件
#ifndef CHARACTER_H
#define CHARACTER_H
#include <time.h>
#include <cstdlib>
class Character
{
protected:
int Health, LightAttack, FierceAttack, Damage;
public:
Character(int health, int lAttack, int fAttack, int damage);
~Character();
public:
int GetHealth() {return Health;}
int GetLightAttack() {return (rand()%5)+10;}
virtual int GetFierceAttack() {return (rand()%5)+10;}
void DeductDamage(int Damage);
};
//Overrides Fierce Attack
class Ogre:public Character
{
public:
Ogre(int health, int lAttack, int fAttack, int damage);
int GetFierceAttack() {return (rand()%10)+20;}
};
#endif
我的Chacter.cpp文件
#include "Character.h"
//Constructor
Character::Character(int health, int lAttack, int fAttack, int damage)
{
Health = health;
LightAttack = lAttack;
FierceAttack = fAttack;
Damage;
}
//Destructor
Character::~Character()
{
}
void Character::DeductDamage(int Damage)
{
Health -= Damage;
if(Health < 0)
{
Health = 0;
}
}
//Constructor
Ogre::Ogre(int health, int lAttack, int fAttack, int damage) //Here's the error
{
}
//Destructor
Ogre::~Ogre()
{
}
答案 0 :(得分:0)
当您为类声明非默认构造函数时,编译器不再生成默认构造函数。
所以你必须自己提供。
答案 1 :(得分:0)
当你在派生类上调用构造函数时,会发生什么:
如果未指定其他构造函数,则默认构造函数将用于(1)。您收到编译器错误,因为您没有默认构造函数。
要指定其他构造函数,请执行以下操作:
Ogre::Ogre(int health, int lAttack, int fAttack, int damage) : Character (health, lAttack, fAttack, damage)
{
// body of constructor
}
然后将调用与这些参数匹配的构造函数的实例。由于您已经定义了,因此不会出现错误。
至于析构函数的错误,首先,正如其他人所说,你不能在不在类中声明它的情况下覆盖析构函数。因此,您可以将~Ogre()
添加到类定义中。但是,您目前没有在析构函数体中执行任何操作,那么为什么要重新定义它呢?只需将其保留为默认的析构函数。
答案 2 :(得分:0)
当您自己定义类的构造函数时,您将覆盖默认实现。 所以你需要提供默认构造函数
class Character
{
public:
Character(){}
//----------your code-----//
}
Similarly for your destructor problem you first decalre destructor in class and then define it in .cpp file.
class Ogre:public Character
{
public:
~Ogre();
}