一、友元概述:
friend并没有打破类的封装,我们可以把friend看出是类的一个公有(public)接口。
友元声明的位置可以位于公有、私有或被保护部分,位置无关紧要。
friend方法和类方法的区别就是firend调用f(x),成员方法x.f().像下面的友元方法要注意它的声明顺序:
class sample{
friend void Remote::set(sample &t,int c);
.........
},在这里的声明顺序如下:
class sample;//前置声明
class Remote{........};
class sample{............};
如果一个函数需要访问两个类的私有数据,那么这样的函数可以是其中一个类的成员,同时又是另一个类的友元,不过把函数作为两个类的友元更合理些。
二、virtual friend
下面的代码实现了一个virtual friend。
class Base {
public:
friend void f(Base& b);
...
protected:
virtual void do_f();
...
};
inline void f(Base& b)
{
b.do_f();
}
class Derived : public Base {
public:
...
protected:
virtual void do_f(); // "Override" the behavior of f(Base& b)
...
};
void userCode(Base& b)
{
f(b);
}