我有两个班,PlayerCharacter
和Ability
。 Ability
类具有纯虚函数,我将其声明为friend
至PlayerCharacter
。但是,我似乎无法访问声明的friend
函数中的私有成员。是我忽略的东西吗?
我试图将子函数而不是虚函数声明为朋友函数,但没有任何效果。
player_chracter.h:
#include "ability.h"
class PlayerCharacter : public Character {
private:
// Friend function
friend bool Ability::ExecuteAbility(PlayerCharacter& in_player);
// This doesn't work either
//friend bool Dash::ExecuteAbility(PlayerCharacter& in_player);
// Private variable
float top_speed_;
}
ability.h:
//Forward declaration
class PlayerCharacter;
class Ability {
public:
Ability();
~Ability();
virtual bool ExecuteAbility(PlayerCharacter& in_player) = 0;
};
//---------------------------------------------------------
class Dash : public Ability {
public:
Dash();
~Dash();
bool ExecuteAbility(PlayerCharacter& in_player);
};
ability.cpp:
#include "ability.h"
#include "player_character.h" //Follow through on forward declaraction
bool Dash::ExecuteAbility(PlayerCharacter& in_player) {
float example = in_player.top_speed_;
}
在上面的代码中,为什么我不能访问top_speed_
并将其放在float example
变量中?
答案 0 :(得分:5)
根据[class.friend]/10
,友谊不会被继承。
派生类不会仅由于其父类是该类的朋友而自动成为该类的朋友。
下面的方法也不起作用的原因可能是因为在定义函数Dash
之前没有定义ExecuteAbility
。
friend bool Dash::ExecuteAbility(PlayerCharacter& in_player);
但是,按照定义的正确顺序,它会起作用。参见DEMO。
答案 1 :(得分:2)
来自cppreference:
友谊不是传递的(您朋友的朋友不是您的朋友)
友谊不是继承的(您朋友的孩子不是您的朋友)
即使Dash::ExecuteAbility
从其基类覆盖friend
函数,也不会从中受益。您必须重新考虑您的设计。