朋友功能无法访问私有成员变量

时间:2019-02-19 09:10:11

标签: c++ friend pure-virtual

我有两个班,PlayerCharacterAbilityAbility类具有纯虚函数,我将其声明为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_;
}

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变量中?

2 个答案:

答案 0 :(得分:5)

根据[class.friend]/10,友谊不会被继承。 派生类不会仅由于其父类是该类的朋友而自动成为该类的朋友。

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

friend bool Dash::ExecuteAbility(PlayerCharacter& in_player);

但是,按照定义的正确顺序,它会起作用。参见DEMO

答案 1 :(得分:2)

来自cppreference

  

友谊不是传递的(您朋友的朋友不是您的朋友)

     

友谊不是继承的(您朋友的孩子不是您的朋友)

即使Dash::ExecuteAbility从其基类覆盖friend函数,也不会从中受益。您必须重新考虑您的设计。

相关问题