friend
船は継承も推移的でもありません。これは、厳密には2つのクラス間の1対1の関係です。
class A {
friend class B;
int Aries;
};
class B {
friend class C;
int Taurus;
};
class C {
int Leo;
void Capricorn() {
A a;
a.Aries = 0; // this wont work, C is not a friend of A.
// friendship is not transitive
}
};
class D : public C {
void Gemini() {
B b;
b.Taurus = 0; // this wont work, D is not a friend of B.
// friendship is not inherited
}
};
class E : public B {
void Scorpio() {
C c;
c.Leo = 0; // this wont work either, friendship is not inherited
}
};
参照:「C++プログラミング言語」BjarneStroustrup
詳細説明(私のもの):friend
船が1対1でなければ、カプセル化は終わりです。クラスは、のクラス宣言がとして宣言されている場合にのみ、のメンバーにB
アクセスできることに注意してください。に出荷を強制することはできません。private
A
A
B
friend
B
friend
A
さて、友情が継承される可能性がある場合、誰かがそれを防ぐことについて何も言わずに、B
のプライベートメンバーにアクセスするために継承する必要があります。また、船を推移的にすることを許可すると、他の問題が発生する可能性があります。これは、が、今度は、まで続く可能性があるためです。、、、...のすべてが、のメンバーにアクセスできるようになりました。これは災害になります。A
A
friend
B
friend
C
friend
D
Z
B
C
D
Z
A
private