友元关系与继承——《C++ primer》笔记,书中的小bug

友元关系,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是不能继承,友元不能访问派生类,但是派生类中的基类部分确实开放访问的,对称的友元的派生类的基类部分,也保留着这个访问特权






  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值