派生 class 能否访问父 class 的受保护内部 class 的私有方法,而父 class 是内部 class 的朋友?

Can a derived class access a private method of a protected inner class of the parent class that is a friend of the inner class?

考虑到这一点class:

class Matchable
{
  protected:
    class Match {
      friend class Matchable;

      void append( const Match& match ) {}
    };

  public:
    virtual bool match( const Source& source ) = 0;
};

... 其中外层 class Matchable 是内层 class Match 的朋友,考虑到这个 class:

class Literal : public Matchable {

  bool match( const Source& source ) override {
    Matchable::Match m;
    Matchable::Match cm;

    m.append( cm );

    return true;
  }

}

... Literal 派生自 Matchable,我似乎能够在 Literal::match() 中实例化 Matchable::Match 没有问题,但我无法调用私有方法 Matchable::Match::append(),我希望 Literal 继承 Matchable.

的 "friendliness"

这是预期的行为吗?如果是,是否有办法让 Literal 访问其父内部 class Match 的私有方法?

是的,这是预期的行为。参见 friend declaration

Friendship is not inherited (your friend's children are not your friends)

您可以在 Matchable 中提供委托方法:

class Matchable
{
  protected:
    class Match {
      friend class Matchable;
      void append( const Match& match ) {}
    };
    void appendMatch( Match& match, const Match& matched ) { 
        match.append(matched);
    }

  public:
    virtual bool match( const Source& source ) = 0;
};

然后

class Literal : public Matchable {

  bool match( const Source& source ) override {
    Matchable::Match m;
    Matchable::Match cm;

    appendMatch(m, cm);

    return true;
  }

}

否则你可能会使 Match::append public(这会使朋友声明变得毫无意义)。