当一个类继承了一个引用私有属性的公共方法时会发生什么



我为warrior类定义了私有属性hpatk,并假设它们不会由派生类继承。

然而,在下面的代码中,派生类knight继承了一个公共方法attack调用私有属性CCD_ 6。在这种情况下,knight.attack((仍然正常工作,并且似乎可以访问私有属性atk,尽管它不应该由派生类继承。

我对此感到困惑。你能帮我解释一下幕后的机制吗?创建knight类的实例时,它是否具有atk属性

#include <cstdio>
class warrior{
private:
int hp,atk;
public:
void attack(int &enemyHP) {
enemyHP -= this->atk;
printf("Deal %d damage to the enemy.n", this->atk);
this->atk += 10;
}
warrior(int hp=100, int atk=20) {
this->hp = hp; this->atk = atk;
}
};
class knight:public warrior{
public:
knight(int hp=200, int atk=50) {}
};
int main()
{
int enemyHP=100;
knight Tom = knight();
Tom.attack(enemyHP); // Deal 20 damage to the enemy.
Tom.attack(enemyHP); // Deal 30 damage to the enemy.
}

当我创建knight类的实例时,它是否具有atk属性?

是的。但只有从warrior继承的方法才能访问它。private的目标是将可见性限制在定义它的类上,但它仍然存在于子类中,它们就是无法访问它(而不是诉诸于未定义的行为,比如访问实例的原始字节(。但由于knightwarrior,当它使用warrior行为(在warrior本身上定义的方法(时,他们可以很好地看到atk

这很好;atk不是knight的公共接口的一部分,但attack是,为了使attack工作,它需要查看warrioratk。通过对直接访问隐藏warrioratk,您已经做了足够的工作来确保knight可以声明其自己的atk成员(这将100%独立于warrioratk,如果也声明了private,则只能从knight上定义的方法访问(。无论如何,它做它应该做的事:

  1. 公共方法在继承时继续工作,即使它们在私有成员上操作
  2. 私有属性不能被任何未定义为其自己类一部分的东西访问(除非通过friend进行访问(

相关内容

  • 没有找到相关文章