一、友元概述:
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);
}