Misalkan kontrol akses datang sebelum resolusi yang berlebihan. Secara efektif, ini berarti public/protected/private
visibilitas terkontrol daripada aksesibilitas.
Bagian 2.10 dari Desain dan Evolusi C ++ oleh Stroustrup memiliki bagian tentang ini di mana dia membahas contoh berikut
int a; // global a
class X {
private:
int a; // member X::a
};
class XX : public X {
void f() { a = 1; } // which a?
};
Stroustrup menyebutkan bahwa keuntungan dari aturan saat ini (visibilitas sebelum aksesibilitas) adalah bahwa (sementara) mengubah bagian private
dalamnya class X
menjadi public
(misalnya untuk tujuan debugging) adalah bahwa tidak ada perubahan diam-diam dalam arti dari program di atas (yaitu X::a
mencoba untuk diakses dalam kedua kasus, yang memberikan kesalahan akses pada contoh di atas). Jika public/protected/private
akan mengontrol visibilitas, arti program akan berubah (global a
akan disebut dengan private
, jika tidak X::a
).
Dia kemudian menyatakan bahwa dia tidak ingat apakah itu dengan desain eksplisit atau efek samping dari teknologi preprocessor yang digunakan untuk mengimplementasikan C dengan pendahulu Classess ke Standar C ++.
Bagaimana ini terkait dengan teladan Anda? Pada dasarnya karena Standar membuat resolusi kelebihan beban sesuai dengan aturan umum bahwa pencarian nama dilakukan sebelum kontrol akses.
10.2 Pencarian nama anggota [class.member.lookup]
1 Pencarian nama anggota menentukan arti nama (ekspresi-id) dalam ruang lingkup kelas (3.3.7). Pencarian nama dapat mengakibatkan ambiguitas, dalam hal ini program memiliki format yang salah. Untuk ekspresi-id, pencarian nama dimulai dalam lingkup kelas this; untuk id yang memenuhi syarat, pencarian nama dimulai dalam cakupan penentu nama bersarang. Pencarian nama dilakukan sebelum kontrol akses (3.4, Klausul 11).
8 Jika nama fungsi yang kelebihan beban ditemukan dengan jelas,
resolusi kelebihan muatan (13.3) juga terjadi sebelum kontrol akses . Ambiguitas sering kali dapat diatasi dengan membuat kualifikasi nama dengan nama kelasnya.