Friend函数无法访问私有成员变量

Hox*_*bot 3 c++ friend pure-virtual

我有两节课,PlayerCharacter而且Ability.所述Ability类具有我声明作为一个纯虚函数friendPlayerCharacter.但是,我似乎无法访问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_;
}
Run Code Online (Sandbox Code Playgroud)

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);
};
Run Code Online (Sandbox Code Playgroud)

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_;
}
Run Code Online (Sandbox Code Playgroud)

在上面的代码中,为什么我无法访问top_speed_并将其放入float example变量中?

P.W*_*P.W 5

按照[class.friend]/10,友谊不是继承的.派生类不会自动成为类的朋友,因为它的父类是该类的朋友.

下面也不起作用的原因可能是因为Dash在定义函数之前没有ExecuteAbility定义.

friend bool Dash::ExecuteAbility(PlayerCharacter& in_player);
Run Code Online (Sandbox Code Playgroud)

但是,通过正确的定义顺序,它将起作用.见DEMO.