15.2.6 友元關系與繼承
像其他類一樣,基類或派生類可以使其他類或函數稱為友元。友元可以訪問類的private和protected數據。
友元關系不能繼承。基類的友元對派生類的成員沒有特殊訪問權限。如果基類被授予友元關系,則只有基類具有特殊訪問權限,該基類的派生類不能訪問授予友元關系的類。
每個類控制對自己的成員的友元關系。
如果派生類想要將自己成員的訪問授予其基類的友元,派生類必須顯式地這樣做:基類的友元對從該基類派生的類型沒有特殊訪問權限。同樣,如果基類和派生類都需要訪問另一個類,那個類必須特地將訪問權授予基類和每一個派生類。
class Base{
friend class Friend;
friend class ChildFriend;
private:
int i;
};
class Child1:private Base{
friend class Friend;
friend class ChildFriend;
private:
int j;
};
class Friend
{
public:
int mem(Base b){return b.i;}
int mem(Child1 c){return c.i+c.j;}
};
class ChildFriend:public Friend
{
public:
int cmem(Base b){return b.i;}
int cmem(Child1 c){return c.i+c.j;}
};
15.2.7 繼承與靜態成員
如果基類定義了static成員,則整個繼承層次中只有一個這樣的成員。無論從基類派生出多少個派生類,每個static成員只有一個實例。
static成員遵循常規訪問控制:如果成員在基類中為private,則派生類不能訪問它。假定可以訪問成員,則既可以通過基類訪問static成員,也可以通過派生類訪問static成員。一般而言,既可以使用作用域操作符也可以使用點或箭頭成員訪問操作符。
class Base{
protected:
static int i;
};
class Child:public Base{
void f(const Child &c)
{
c.i;
Base::i;
Child::i;
i;
}
};
摘自 xufei96的專欄