は公にA
から継承され、Aの保護部材(単数または複数)Bの保護材(S)となるので、Bは、としての保護部材にアクセスすることができ通常、そのメンバ関数から継承します。つまり、B
のオブジェクトは、そのメンバ関数からB
の保護されたメンバにアクセスできます。
ただし、Aの保護されたメンバーには、A
というオブジェクトを使用して、クラスの外部にアクセスすることはできません。
ここ標準から関連するテキスト(2003)
11.5プロテクトメンバアクセス[クラスです。
派生クラスのフレンドまたはメンバー関数が、保護された非静的メンバー関数または基本クラスの保護された非静的データメンバーを参照する場合は、前述の11.102節で説明したものに加えてアクセスチェックが適用されます。 (5.3.1)、へのポインタを作成するには、派生クラス自体(またはそのクラスから派生した任意のクラス)へのポインタ、参照先、またはオブジェクトを経由する必要があります。(5.2.5)。アクセスがメンバへのポインタを形成する場合、ネストされた名前指定子は、派生クラス(またはそのクラスから派生した任意の クラス)の名前を付けます。
、実施例として(2003)標準からそれ自体を次の上記の例fr()
で
[Example:
class B {
protected:
int i;
static int j;
};
class D1 : public B {
};
class D2 : public B {
friend void fr(B*,D1*,D2*);
void mem(B*,D1*);
};
void fr(B* pb, D1* p1, D2* p2)
{
pb->i = 1; // ill-formed
p1->i = 2; // ill-formed
p2->i = 3; // OK (access through a D2)
p2->B::i = 4; // OK (access through a D2, even though naming class is B)
int B::* pmi_B = &B::i; // ill-formed
int B::* pmi_B2 = &D2::i; // OK (type of &D2::i is int B::*)
B::j = 5; // OK (because refers to static member)
D2::j =6; // OK (because refers to static member)
}
void D2::mem(B* pb, D1* p1)
{
pb->i = 1; // ill-formed
p1->i = 2; // ill-formed
i = 3; // OK (access through this)
B::i = 4; // OK (access through this, qualification ignored)
int B::* pmi_B = &B::i; // ill-formed
int B::* pmi_B2 = &D2::i; // OK
j = 5; // OK (because j refers to static member)
B::j = 6; // OK (because B::j refers to static member)
}
void g(B* pb, D1* p1, D2* p2)
{
pb->i = 1; // ill-formed
p1->i = 2; // ill-formed
p2->i = 3; // ill-formed
}
—end example]
注D2
のフレンド関数である、mem()
はD2
のメンバ関数であり、そしてg()
であります友人もメンバーも機能しません。
である。しかし 'X'は、この例ではB' 'の保護されたメンバーであるような完全なオブジェクト指向プログラミング、あるホープ、アクセスは許可されません。私はこれが質問に答えるとは思わない。 –
@Billy ONeal:C++アクセス制御では、オブジェクト単位ではなく、クラス単位で動作するため、クラスBのオブジェクトはクラスBの別のオブジェクトのメンバにアクセスできます。 –