私は次のクエリを持っています。継承と友情のアクセス。 C++
classB inherits from classA
classC is friend of classB
これは、classCがclassAの保護されたメンバーにアクセスできるはずではないということですか? classBはclassAからこれを継承するので、classCはclassBクラスのすべてにアクセスできますか?
私は次のクエリを持っています。継承と友情のアクセス。 C++
classB inherits from classA
classC is friend of classB
これは、classCがclassAの保護されたメンバーにアクセスできるはずではないということですか? classBはclassAからこれを継承するので、classCはclassBクラスのすべてにアクセスできますか?
それはclassC
がclassB
の保護classA
サブオブジェクトの一部にアクセスすることができなければならないことを意味します。 でないと、から非公開のものにアクセスすることはできません。例えば
:
class C;
class A
{
protected:
int i;
};
class B:
public A
{
friend class C;
};
class C
{
public:
void foo(A& a, B& b)
{
// a.i = 3; // not allowed
b.i = 3; // allowed, accesses the `i` of the `A` subobject of `B`
}
};
[私の元の答えはナンセンスでした。それについての謝罪。それを指摘し、より良い答えを提供するための@celtschkをお願いいたします。] C
はB
の友人がある
場合、それは、プライベート、パブリック、または保護されたかどうか、B
のメンバーのすべてにアクセスすることができ、それは、ベースサブオブジェクトの一部であるアクセス可能(publicおよびprotected)メンバー:
struct A { protected: int a; };
struct B : A { private: int b; friend struct C; }
struct C
{
B x;
A w;
void f()
{
x.a = 1; // fine
x.b = 2; // fine
// w.a = 0; /* Error, #1 */
}
friend struct D; // see below
};
しかし、友情は推移も継承もない:C
はB
の友人ですが、A
の(#1を参照)ではありません。また、D
場合C
の友人は、その後、D
「はB
への友情をもたらすのでD
はB
アクセスすることができません」C
は、アクセスのいずれかを取得していないの非パブリックメンバーを。 C
からstruct E : C
継承する場合も同様に、その後、E
も自動的B
の友人ではありません。
struct D
{
B y;
void g()
{
// y.b = 3; /* Error! */
}
};
struct E : C
{
B z;
void h()
{
// y.b = 4; /* Error! */
}
}
おそらく1は、いくつかのポイントで何が起こっているかを要約することができます
派生クラスは、アクセス権を持っています各基本クラスのすべての公開メンバーと保護されたメンバーに送信します。
クラスのフレンドは、そのクラスにアクセスできるすべてのメンバー(つまり、プライベートベースメンバーを除くすべてのメンバー)にアクセスできます。
友人関係が継承されない:クラスにフレンドがある場合、そのフレンドシップは基本クラスも派生クラスのいずれにも適用されません。
友人の友人は友人ではありません。
これは最初の質問に対するより良い回答です。 –
@KerrekSB:ありがとうございます。 – celtschk