Załóżmy, że kontrola dostępu nastąpiła przed rozwiązaniem problemu przeciążenia. W rzeczywistości oznaczałoby to public/protected/private
kontrolowaną widoczność, a nie dostępność.
Sekcja 2.10 projektu i ewolucji C ++ autorstwa Stroustrupa zawiera fragment na ten temat, w którym omawia następujący przykład
int a; // global a
class X {
private:
int a; // member X::a
};
class XX : public X {
void f() { a = 1; } // which a?
};
Stroustrup wspomina, że korzyści wynikające z obowiązujących przepisów (widoczności przed dostępność) jest to, że (tymczasowo) chaning z private
wnętrza class X
do public
(na przykład dla celów debugowania) to, że nie ma żadnych zmian cicho w rozumieniu powyższego programu (czyli X::a
próbuje się być dostępne w obu przypadkach, co daje błąd dostępu w powyższym przykładzie). Gdyby public/protected/private
kontrolował widoczność, znaczenie programu by się zmieniło (w przeciwnym razie global a
zostałby wywołany with ).private
X::a
Następnie stwierdza, że nie przypomina sobie, czy było to spowodowane jawnym projektem, czy efektem ubocznym technologii preprocesora używanej do implementacji C z poprzednikiem Classess standardowego C ++.
Jak to się ma do twojego przykładu? Zasadniczo dlatego, że standardowe rozpoznawanie przeciążenia jest zgodne z ogólną zasadą, że wyszukiwanie nazw ma miejsce przed kontrolą dostępu.
10.2 Wyszukiwanie nazw członków [class.member.lookup]
1 Wyszukiwanie nazw składowych określa znaczenie nazwy (wyrażenie id) w zakresie klasy (3.3.7). Wyszukiwanie nazwy może skutkować niejednoznacznością, w którym to przypadku program jest źle sformułowany. W przypadku wyrażenia id, wyszukiwanie nazw zaczyna się w zakresie klasy this; w przypadku kwalifikowanego identyfikatora wyszukiwanie nazwy zaczyna się w zakresie zagnieżdżonego specyfikatora nazwy. Wyszukiwanie nazwy ma miejsce przed kontrolą dostępu (3.4, Klauzula 11).
8 Jeśli nazwa przeciążonej funkcji zostanie znaleziona jednoznacznie,
to przed kontrolą dostępu następuje również rozwiązanie przeciążenia (13.3) . Niejednoznaczności często można rozwiązać, kwalifikując nazwę za pomocą nazwy klasy.