Itu karena pencarian nama berhenti jika menemukan nama di salah satu basis Anda. Itu tidak akan terlihat di pangkalan lain. Fungsi di B membayangi fungsi di A. Anda harus mendeklarasikan kembali fungsi A dalam lingkup B, sehingga kedua fungsi tersebut terlihat dari dalam B dan C:
class A
{
public:
void foo(string s){};
};
class B : public A
{
public:
int foo(int i){};
using A::foo;
};
class C : public B
{
public:
void bar()
{
string s;
foo(s);
}
};
Sunting: Deskripsi sebenarnya yang diberikan Standar adalah (dari 10.2 / 2):
Langkah-langkah berikut menentukan hasil pencarian nama dalam ruang lingkup kelas, C. Pertama, setiap deklarasi untuk nama di kelas dan di setiap sub-objek kelas dasarnya dipertimbangkan. Sebuah nama anggota f dalam satu sub-objek B menyembunyikan nama anggota f dalam sub-objek A jika A adalah sub-objek kelas dasar B. Setiap deklarasi yang begitu tersembunyi dieliminasi dari pertimbangan. Masing-masing deklarasi ini yang diperkenalkan oleh deklarasi use dianggap dari setiap sub-objek C yang berjenis berisi deklarasi yang ditunjuk oleh deklarasi using.96) Jika set deklarasi yang dihasilkan tidak semua dari sub-objek dengan tipe yang sama, atau himpunan memiliki anggota nonstatic dan termasuk anggota dari sub-objek yang berbeda, ada ambiguitas dan program tidak berbentuk. Jika tidak, set tersebut adalah hasil dari pencarian.
Ini memiliki yang berikut untuk dikatakan di tempat lain (tepat di atasnya):
Untuk ekspresi-id [ sesuatu seperti "foo" ], pencarian nama dimulai dalam ruang lingkup kelas ini; untuk kualifikasi-id [ sesuatu seperti "A :: foo", A adalah penentu-nama-bersarang ], pencarian nama dimulai dalam lingkup penentu-nama-bersarang. Pencarian nama dilakukan sebelum kontrol akses (3.4, klausul 11).
([...] dimasukkan oleh saya). Perhatikan bahwa meskipun foo Anda di B bersifat pribadi, foo di A tetap tidak akan ditemukan (karena kontrol akses terjadi nanti).