答案 0 :(得分:5)
不,你不能。
一种解决方法是将该特定成员函数放在C继承的单独类C2中,并与C2建立友谊。
答案 1 :(得分:4)
没有办法直接用友谊做到这一点,但你可以通过修改基于标签的调度来达到类似的效果:
class C
{
public:
class AccessTag
{
friend class C;
friend void F();
private:
AccessTag() {}
};
void functionToAccess(AccessTag)
{
std::cout << "Restricted function called!\n";
}
};
void F()
{
C c;
c.functionToAccess(C::AccessTag()); // OK
}
void nonF()
{
C c;
c.functionToAccess(C::AccessTag()); // error, nonF cannot access ctor of C::AccesTag
}
我们的想法是只允许那些可以构造functionToAccess
对象的人调用C::AccessTag
。由于它的私有构造函数,C::AccessTag
只能由其朋友构建。这些是C
(因此它可以调用functionToAccess
本身,因为它可以调用其任何其他私有函数)和F
。 F
无法访问C
的任何其他非公开成员,因为它不是C
的朋友。
您甚至可以为不同的成员函数(或成员函数组)使用不同的访问标记。