友元関係と継承——『C++primer』ノート、本の中の小さなバグ
友元関係は、friendshipが継承できない.この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は継承できず,友元は派生クラスにアクセスできないが,派生クラスの中のベースクラス部分は確かにオープンアクセスであり,対称の友元の派生クラスのベースクラス部分も,このアクセス特権を保持している.