继承入门C++问题

Inheritance Beginner C++ Issue

本文关键字:问题 C++ 继承      更新时间:2023-10-16

我似乎在继承方面遇到了问题。每当我试图重写Character.cpp文件中的函数时,我都会收到一个错误:"不存在类Character的默认构造函数"。我对c++还很陌生,不明白为什么会出现错误。我想做的基本上是覆盖默认Character类的GetFierceAttack(),使其对于名为Ogre的子类更强。我想知道我是否正确使用了"虚拟"。

我的角色.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()
{
}

当您自己为类定义构造函数时,您将覆盖默认实现。因此,您需要提供默认构造函数作为

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();
}

当为类声明非默认构造函数时,编译器不再生成默认构造函数。

所以你必须自己提供。

当您在派生类上调用构造函数时,会发生以下情况:

  1. 首先构造基础对象
  2. 初始化列表中的任何变量都会被初始化
  3. 执行(派生的)构造函数的主体

如果不指定其他构造函数,则默认构造函数将用于(1)。由于没有默认构造函数,您将遇到编译器错误。

要指定不同的构造函数,请执行以下操作:

Ogre::Ogre(int health, int lAttack, int fAttack, int damage) : Character (health, lAttack, fAttack, damage)
{
// body of constructor
}

然后将调用与这些参数匹配的构造函数实例。既然您已经定义了它,就不会出现错误。

至于析构函数上的错误,首先,正如其他人所说,如果不在类中声明析构函数,就不能覆盖它。因此,您可以将~Ogre()添加到类定义中。然而,你目前没有在析构函数体内做任何事情,那么你为什么要重新定义它呢?只需将其保留为默认的析构函数即可。