友元关系,friendship不能继承,书中想表达的意思是这种friendship不能继承是双向的。
也就是说,自己朋友的儿子不能访问自己,朋友也不能访问自己的儿子,唯一的关联是朋友和自己
但是,书中的代码表达确实是有错误的,如果我的想法是错的,欢迎指正。。。。。。。。。。。。
测试代码如下:
//派生类不能继承友元关系,双向的,既不能享受访问权力也不能被访问
#include<iostream>
class Base{
friend class Frnd;
protected:
int i;
};
//Frnd has no access to members in D1
class D1 : public Base{
protected:
int j;
};
class Frnd{
public:
int mem(Base b) { return b.i; }//ok:Frnd is friend to Base
int mem(D1 d) { return d.i; }//书上认为这个是错误的,描述是:friendship doesn't inherit
//int mem(D1 d) { return d.j; }//事实是这个才是错误的,friendship是没inherit,但是i是派生类的基类部分
};
//D2 has no access to members in Base
class D2 : public Frnd{//访问权限没继承来
public:
//int mem(Base b) { return b.i; }//'int Base::i' is protected,
};
int main(){
D1 d;
Base *b = &d;
D2 d2;
Frnd *f1 = &d2;
//打印一样,书上解释错了,访问d.i没错,d.j才是不能被访问的,说明friend关系确实没继承,但是派生类中的基类部分还是可以被访问的。
//打印值相同
std::cout << d2.mem(*b) << std::endl;
std::cout << d2.mem(d) << std::endl;
//上边的d2.mem()是从Frnd继承来的,说明继承来的基类部分也有访问Base的特权
//综合就是,虽然友元关系的双向都是不可继承的,但是继承过来的基类部分都保留有原权力
}
friendship是不能继承,友元不能访问派生类,但是派生类中的基类部分确实开放访问的,对称的友元的派生类的基类部分,也保留着这个访问特权