Dalam pengaturcaraan berorientasikan objek, kelas terbitan boleh mewarisi ahli daripada kelas asas mereka. Walau bagaimanapun, isu mungkin timbul apabila fungsi dengan nama yang sama tetapi tandatangan yang berbeza wujud dalam kedua-dua kelas asas dan terbitan. Ini boleh membawa kepada ralat seperti "Fungsi dengan nama yang sama tetapi tandatangan berbeza dalam kelas terbitan tidak ditemui."
Untuk menggambarkan masalah ini, pertimbangkan coretan kod berikut:
class A { public: void foo(string s) {} }; class B : public A { public: int foo(int i) {} }; class C : public B { public: void bar() { string s; foo(s); // Error: no matching function } };
Apabila menyusun kod ini, pengkompil menghadapi ralat dalam panggilan foo(s) dalam fungsi bar() kelas C. Walaupun fungsi foo(string s) sedang hadir dalam kelas asas A, pengkompil gagal mengenalinya disebabkan fenomena yang dikenali sebagai fungsi menyembunyikan.
Dalam senario ini, fungsi foo(int i) yang ditakrifkan dalam kelas B menyembunyikan fungsi foo(rentetan s) yang diwarisi daripada kelas A. Ini kerana carian nama dalam hierarki kelas berhenti pada pengisytiharan pertama nama yang sepadan. Oleh itu, apabila proses carian mencapai kelas B, ia menemui fungsi foo(int i) dan mengabaikan fungsi foo(rentetan s) yang ditindih dalam kelas asas.
Untuk menyelesaikan isu ini, seseorang mesti mengisytiharkan semula secara eksplisit fungsi kelas asas dalam skop kelas terbitan. Dengan menggunakan kata kunci menggunakan untuk mewarisi fungsi kelas asas, kedua-dua fungsi menjadi kelihatan dalam kelas terbitan dan subkelasnya:
class A { public: void foo(string s) {} }; class B : public A { public: int foo(int i) {} using A::foo; // Redeclare base class foo function }; class C : public B { public: void bar() { string s; foo(s); // Now finds the base class foo(string s) } };
Dengan memasukkan baris ini dalam kelas B, carian nama akan mempertimbangkan dengan betul kedua-dua foo( int i) dan foo(rentetan s), menyelesaikan isu penyembunyian fungsi.
Atas ialah kandungan terperinci Mengapa 'Berfungsi dengan Nama Yang Sama tetapi Tandatangan Berbeza dalam Kelas Terbitan Tidak Ditemui' Berlaku dalam Warisan C?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!