2012-04-05 13 views
7

Ich habe folgende Abfrage;Zugang zu Vererbung und Freundschaft. C++

Bedeutet dies nicht, dass classC in der Lage sein sollte, auf geschützte Member der Klasse A zuzugreifen? Da Klasse B das von Klasse A erbt, kann eine Klasse C auf alles in Klasse Klasse B zugreifen?

Antwort

6

Es bedeutet, dass classC Lage sein sollte, um den geschützten classA subobject Teil classB zuzugreifen. Es sollte nicht in der Lage sein, auf alles nicht-öffentliche von classA selbst zuzugreifen.

Zum Beispiel:

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` 
    } 
}; 
+0

Dies ist die bessere Antwort für die ursprüngliche Frage. –

+0

@KerrekSB: Danke. – celtschk

8

[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.

+0

Es kann auch die geschützten Mitglieder des 'die B' Zugriff' A' subobject. Es kann einfach nicht auf geschützte Mitglieder von beliebigen 'A'-Objekten zugreifen (aber auch nicht' B'). – celtschk

+0

@celtschk: Ich denke meine Antwort ist völlig falsch. Ich muss es überarbeiten. –

+0

Es ist immer noch nicht ganz korrekt: Es kann natürlich nur auf die Mitglieder des Subobjekts "A" zugreifen, auf die "B" selbst zugreifen kann. Wie geschrieben, sollte es auch Zugriff auf private Mitglieder von "A" haben. – celtschk