virtual friend的實(shí)現(xiàn)
一、友元概述:
friend并沒(méi)有打破類的封裝,我們可以把friend看出是類的一個(gè)公有(public)接口。
友元聲明的位置可以位于公有、私有或被保護(hù)部分,位置無(wú)關(guān)緊要。
friend方法和類方法的區(qū)別就是firend調(diào)用f(x),成員方法x.f().像下面的友元方法要注意它的聲明順序:
class sample{
friend void Remote::set(sample &t,int c);
.........
},在這里的聲明順序如下:
class sample;//前置聲明
class Remote{........};
class sample{............};
如果一個(gè)函數(shù)需要訪問(wèn)兩個(gè)類的私有數(shù)據(jù),那么這樣的函數(shù)可以是其中一個(gè)類的成員,同時(shí)又是另一個(gè)類的友元,不過(guò)把函數(shù)作為兩個(gè)類的友元更合理些。
二、virtual friend
下面的代碼實(shí)現(xiàn)了一個(gè)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);
}
friend并沒(méi)有打破類的封裝,我們可以把friend看出是類的一個(gè)公有(public)接口。
友元聲明的位置可以位于公有、私有或被保護(hù)部分,位置無(wú)關(guān)緊要。
friend方法和類方法的區(qū)別就是firend調(diào)用f(x),成員方法x.f().像下面的友元方法要注意它的聲明順序:
class sample{
friend void Remote::set(sample &t,int c);
.........
},在這里的聲明順序如下:
class sample;//前置聲明
class Remote{........};
class sample{............};
如果一個(gè)函數(shù)需要訪問(wèn)兩個(gè)類的私有數(shù)據(jù),那么這樣的函數(shù)可以是其中一個(gè)類的成員,同時(shí)又是另一個(gè)類的友元,不過(guò)把函數(shù)作為兩個(gè)類的友元更合理些。
二、virtual friend
下面的代碼實(shí)現(xiàn)了一個(gè)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);
}
posted on 2009-06-03 22:40 Benjamin 閱讀(543) 評(píng)論(0) 編輯 收藏 引用 所屬分類: C/C++

