[Meine ursprüngliche Antwort war Unsinn. Entschuldigung dafür. Vielen Dank für die @celtschk dass herausstellen und die Bereitstellung der bessere Antwort.]
Wenn C
ist ein Freund von B
, kann es all B
‚s Mitglieder zugreifen, egal ob privat, öffentlich oder geschützt, und das schließt die zugänglich (öffentliche und geschützten) Mitglieder, der Teil einer Basis subobject sind:
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
};
jedoch Freundschaft weder transitiv ist noch geerbt: C
ein Freund von B
ist, aber nicht von A
(siehe # 1). Auch wenn D
ist ein Freund von C
, dann ist D
nicht der Zugang zu bekommen, die C
's Freundschaft B
es gewährt, so kann D
nicht B
Zugang ist nicht-öffentlichen Mitglieder. Und falls struct E : C
erbt von C
, dann ist E
auch kein Freund von B
automatisch:
struct D
{
B y;
void g()
{
// y.b = 3; /* Error! */
}
};
struct E : C
{
B z;
void h()
{
// y.b = 4; /* Error! */
}
}
Vielleicht kann man zusammenfassen, was in einigen Punkten geht:
Eine abgeleitete Klasse hat Zugriff an alle öffentlichen und geschützten Mitglieder jeder Basisklasse.
Ein Freund einer Klasse hat Zugriff auf alle Mitglieder dieser Klasse, die für ihn zugänglich sind (d. H. Alle Mitglieder außer private Basismitglieder).
Freundschaft wird nicht vererbt: Wenn eine Klasse einen Freund hat, gilt diese Freundschaft weder für eine ihrer Basisklassen noch für eine ihrer abgeleiteten Klassen.
Ein Freund eines Freundes ist kein Freund.
Dies ist die bessere Antwort für die ursprüngliche Frage. –
@KerrekSB: Danke. – celtschk