考虑这个课程:
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
的私有方法?
答案 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
(这使得朋友声明毫无意义)。