友元関係と継承——『C++primer』ノート、本の中の小さなバグ


友元関係は、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は継承できず,友元は派生クラスにアクセスできないが,派生クラスの中のベースクラス部分は確かにオープンアクセスであり,対称の友元の派生クラスのベースクラス部分も,このアクセス特権を保持している.