派生 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
(这会使朋友声明变得毫无意义)。
考虑到这一点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
.
这是预期的行为吗?如果是,是否有办法让 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
(这会使朋友声明变得毫无意义)。