继承理解拒绝对派生类进行访问

Inheritance understanding access denied for a derived class

本文关键字:访问 派生 拒绝 继承      更新时间:2023-10-16

我现在对此有点困惑,据我所知,特定的敌人继承自基本敌人类,所以当创建时,他们使用基本敌人构造函数,创建他们自己的对象副本的变量来工作。所以当我使用继承敌人的set_E函数时,不会设置自己的E_Damage和E_Health来工作吗?如果是这样,为什么它拒绝访问自己的变量?

在visualbasic上的locals选项卡中,每个x对象确实有自己的敌人变量,如果我尝试直接访问敌人类,我会得到访问错误,如果我尝试使用对象自己,我也会得到这个错误,我做错了什么?

基本敌人类

class Enemy
{
public:

Enemy();
~Enemy();

void set_E(float, float);
float get_E_H();
float get_E_D();

virtual void Battle() = 0;

float* E_Damage;
float* E_Health;
char* E_Descrip;
float* E_Attack;
};
敌人distructor

   Enemy::~Enemy()
  {
    if (E_Damage != nullptr)
  {
    delete E_Damage;
    E_Damage = nullptr;
  }
  if (E_Health != nullptr)
  {
        delete E_Health;
    E_Health = nullptr;
  }
  if (E_Attack != nullptr)
  {
    delete E_Attack;
    E_Attack = nullptr;
  }
  if (E_Descrip != nullptr)
  {
    delete E_Descrip;
    E_Descrip = nullptr;
  }

}

敌人构造函数:

E_Damage = new float;
E_Damage = nullptr;
E_Health = new float;
E_Health = nullptr;
E_Attack = new float;
E_Attack = nullptr;

继承的敌人。h

class T_Rex : private Enemy, private CS_Text_Adventure
{
public:
void T_Rex::set_E(float Dmg, float Health, T_Rex x);
T_Rex();

~T_Rex();

void Battle() override;
};

继承的例子enemy.cpp

void T_Rex::Battle()
{
    T_Rex x;
    x.set_E(15.0f, 100.0f, x);
    E_Descrip = "the passage way opens up to a tropical forrest";
        std::cout << std::endl;
        std::cout << x.E_Descrip << std::endl;
        std::cout << std::endl;
        while(*fight == true)
        {
            *x.E_Attack = rand() % 100 + 0;
            if(*x.E_Attack >= 30)
            {
                *P_Health -= *x.E_Damage;
            }
            else if(*x.E_Attack < 30)
            {
                *x.E_Health -= *P_Health;
            }
            if(*P_Health <= 0)
            {
            *gamerun = false;
            }
            else if(*E_Health <= 0)
            {
            *fight = false;
            }
        }
        step++;
}

对指针的未授权访问:

void T_Rex::set_E(float Dmg, float Health, T_Rex x)
{
*x.E_Damage = Dmg;
*x.E_Health = Health;
}

让我们从构造函数中取出这两行:

E_Damage = new float;
E_Damage = nullptr;

首先分配单个float,并使E_Damage指向它。然后你立即使E_Damage为空指针,所以它不再指向任何有效的地方。这将导致内存泄漏。

之后使用这个空指针,这会导致未定义的行为和可能的崩溃。

对于单个值,几乎不需要使用指针,尤其是在这种情况下。只需将E_Damage(和其他成员变量)声明为普通的非指针变量。