1. 某基類為另一類的友元,該基類的派生類是否為其友元
答:否
class Base
{};
class Derived : public Base
{};
class SomeClass
{
int _i;
public:
friend class Base; // 是否Derived也是類SomeClass的友元
}
---------------------------------------------------------------
不可以:例子見下
#include <iostream>
using namespace std;
class Base;
class SomeClass
{
int _i;
public:
void prnt() { cout << "_i = " << _i << endl;}
SomeClass() : _i(0) {}
friend class Base; // 是否Derived也是類SomeClass的友元:否
};
class Base
{
public:
SomeClass one;
void foo()
{
one._i = 123;
}
};
//*
class Derived : public Base
{
public:
SomeClass two;
void foo()
{
SomeClass two;
two._i =789; // 編譯在此出錯
}
};
//*/
void main()
{
Base b;
b.one.prnt();
b.foo();
b.one.prnt();
/*
Derive d;
d.two.prnt();
d.foo();
some.prnt();
//*/
}
這樣做顯然是為了安全,避免被惡意突破對對象的封裝,以便一切盡在控制之中
--------------------------------------------------------------- ---------------------------
2.基類的友元對從該基類派生的類型沒有特殊訪問權限。
如果基類和派生類都需要訪問另一個類,那個類必須特地將訪問權限授予基類和每一個派生類
#include<iostream>
using namespace std;
class Base{
friend class Frnd;
//friend class D2;
protected:
int i;
};
class D1:public Base{
protected:
int j;
};
class Frnd{
public:
int mem(Base b){return b.i;}
//int mem(D1 d){return d.i;}//錯誤,基類友元對其派生類無作用
};
class D2: public Frnd{
public:
int mem(Base b){return b.i;}//錯誤,友元的派生類也不可以....,想訪問,必須定義friend
};
void main()
{
}
3.派生類的友元可以訪問基類
#include<iostream>
using namespace std;
class Base{
public:
protected:
int i;
};
class D1:public Base{
private:
int j;
friend class Frnd;
};
class Frnd{
public:
//int mem(Base& b){return b.i;}//錯誤,這是Base的引用,Frnd 是D1的友元但不是Base的
int mem(D1 &d){return d.i;}//正確,D1的引用,友元定義于D1,就像其成員函數(shù)一樣可訪問基類
};
void main()
{
}