您的位置:首页 > 编程语言 > C语言/C++

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

2012-05-02 11:29 253 查看
友元关系,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是不能继承,友元不能访问派生类,但是派生类中的基类部分确实开放访问的,对称的友元的派生类的基类部分,也保留着这个访问特权
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: