继承初学者C ++问题

时间:2014-01-13 10:26:05

标签: c++ inheritance virtualization

我似乎遇到了继承问题。每当我尝试覆盖我的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()
    {
    }

3 个答案:

答案 0 :(得分:0)

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

所以你必须自己提供。

答案 1 :(得分:0)

当你在派生类上调用构造函数时,会发生什么:

  1. 首先构建基础对象
  2. 初始化列表中的任何变量都已初始化
  3. 执行(派生)构造函数的主体
  4. 如果未指定其他构造函数,则默认构造函数将用于(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();
           }
相关问题