Angenommen, die Zugriffskontrolle erfolgte vor der Überlastungsauflösung. Tatsächlich würde dies bedeuten, dass public/protected/private
die Sichtbarkeit und nicht die Zugänglichkeit kontrolliert wird.
Abschnitt 2.10 von Design und Evolution von C ++ von Stroustrup enthält eine Passage, in der er das folgende Beispiel erläutert
int a; // global a
class X {
private:
int a; // member X::a
};
class XX : public X {
void f() { a = 1; } // which a?
};
Stroustrup erwähnt , dass ein Vorteil der geltenden Regeln (Sichtbarkeit vor Zugänglichkeit) , die (vorübergehend) die chaning private
innen class X
in public
(zB für die Zwecke des Debugging) ist , dass es im Sinne des oben genannten Programms keine ruhige Änderung (dh X::a
wird versucht, in beiden Fällen zugegriffen werden, was im obigen Beispiel einen Zugriffsfehler ergibt). Wenn public/protected/private
die Sichtbarkeit gesteuert würde, würde sich die Bedeutung des Programms ändern ( andernfalls würde global a
aufgerufen ).private
X::a
Er gibt dann an, dass er sich nicht daran erinnert, ob es sich um ein explizites Design oder einen Nebeneffekt der Präprozessortechnologie handelte, die zur Implementierung des C mit Classess-Vorgänger von Standard C ++ verwendet wurde.
Wie hängt das mit Ihrem Beispiel zusammen? Grundsätzlich, weil die vom Standard vorgenommene Überlastungsauflösung der allgemeinen Regel entspricht, dass die Namenssuche vor der Zugriffskontrolle erfolgt.
10.2 Suche nach Mitgliedsnamen [class.member.lookup]
1 Die Suche nach Mitgliedsnamen bestimmt die Bedeutung eines Namens (ID-Ausdrucks) in einem Klassenbereich (3.3.7). Die Namenssuche kann zu Mehrdeutigkeiten führen. In diesem Fall ist das Programm fehlerhaft. Bei einem ID-Ausdruck beginnt die Namenssuche im Klassenbereich. Bei einer qualifizierten ID beginnt die Namenssuche im Bereich des verschachtelten Namensbezeichners. Die Namenssuche erfolgt vor der Zugriffskontrolle (3.4, Abschnitt 11).
8 Wird der Name einer überladenen Funktion eindeutig gefunden, erfolgt die
Überladungsauflösung (13.3) auch vor der Zugriffskontrolle . Mehrdeutigkeiten können häufig behoben werden, indem ein Name mit seinem Klassennamen qualifiziert wird.