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,就像其成员函数一样可访问基类
};
void main()
{
}