派生类是否可以访问作为内部类的朋友的父类的受保护内部类的私有方法?

时间:2016-03-20 02:17:18

标签: c++ inheritance inner-classes friend

考虑这个课程:

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

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

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

...外部类Matchable是内部类Match的朋友,并考虑此类:

class Literal : public Matchable {

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

    m.append( cm );

    return true;
  }

}

...其中Literal来自Matchable,我似乎能够在Matchable::Match中实例化Literal::match()而没有问题,但我无法调用私有方法Matchable::Match::append(),我希望Literal继承Matchable的“友好”。

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

1 个答案:

答案 0 :(得分:2)

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

  

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

您可以在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(这使得朋友声明毫无意义)。