B
ist Zugriff auf geschützte Mitglieder von A
erlaubt, solange der Zugriff über ein Objekt vom Typ B
erfolgt. In Ihrem Beispiel versuchen Sie, über A
auf foo
zuzugreifen, und in diesem Zusammenhang ist es unerheblich, ob B
von A
abgeleitet ist oder nicht.
Von N3337, §11.4/1 [class.protected]
Eine zusätzliche Zugangskontrolle über den früher 11 in Abschnitt beschrieben wird angewendet, wenn ein nicht-statisches Datenelement oder nicht-statischen Die Memberfunktion ist ein geschütztes Mitglied ihrer Benennungsklasse (11.2). Wie bereits beschrieben, wird früher, der Zugriff auf ein geschütztes Mitglied gewährt, da die Referenz in einem Freund oder Mitglied einer Klasse C
vorkommt. Wenn der Zugriff einen Zeiger auf das Element (5.3.1) bilden soll, muss der Name der verschachtelten BezeichnungC
oder eine Klasse sein, die von C
abgeleitet ist. Alle anderen Zugriffe beinhalten einen (möglicherweise impliziten) Objektausdruck (5.2.5). In diesem Fall muss die Klasse des Objektausdrucks C
oder eine von C
abgeleitete Klasse sein. [Beispiel:
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 D2::mem(B* pb, D1* p1) {
// ...
int B::* pmi_B = &B::i; // ill-formed
int B::* pmi_B2 = &D2::i; // OK
// ...
}
// ...
-Ende Beispiel]
Ihr Beispiel ist sehr ähnlich zu dem Code in D2::mem
, die zeigt, dass stattdessen einen Zeiger auf ein geschütztes Element durch B
zu bilden versuchen, von D2
ist schlecht ausgebildet.
Gute Frage.Scheint wie eine zukünftige Korrektur! – iammilind