Melebihi Beban Fungsi dalam Warisan: Memahami Fungsi Tersembunyi
Dalam pengaturcaraan berorientasikan objek, warisan membenarkan kelas mewarisi sifat dan kaedah daripada kelas induk. Walau bagaimanapun, apabila mentakrifkan fungsi dengan nama yang sama tetapi tandatangan berbeza dalam kelas asas dan terbitan, carian nama boleh menjadi samar-samar, membawa kepada ralat.
Masalah:
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: member function not found } };
Apabila cuba memanggil foo yang diganti fungsi dalam kelas terbitan C, pengkompil menghadapi ralat kerana carian nama berhenti pada kelas terbitan B dan tidak dapat mencari foo yang diwarisi daripada kelas asas A.
Penyelesaian:
Untuk menyelesaikan isu ini, fungsi dari kelas asas mesti diisytiharkan secara eksplisit dalam skop kelas terbitan menggunakan kata kunci menggunakan. Ini menjadikan kedua-dua fungsi kelihatan dari dalam kelas terbitan.
class A { public: void foo(string s){}; }; class B : public A { public: int foo(int i){}; using A::foo; // Re-declare function from base class }; class C : public B { public: void bar() { string s; foo(s); // Now calls the inherited 'foo' function } };
Penjelasan:
Pencarian nama dalam warisan adalah hierarki. Secara lalai, carian nama mengutamakan fungsi yang ditakrifkan dalam kelas terbitan. Dalam contoh di atas, apabila foo(s) dipanggil dalam C, pengkompil mula-mula mencari fungsi padanan dalam C, kemudian dalam B, dan akhirnya dalam A. Walau bagaimanapun, memandangkan B mempunyai fungsi foo sendiri, carian berhenti di sana, mengakibatkan ralat.
Dengan mengisytiharkan secara eksplisit fungsi foo kelas asas dalam B menggunakan menggunakan A::foo, pengkompil diarahkan untuk mempertimbangkan kedua-dua fungsi semasa nama carian. Ini membolehkan fungsi foo yang diwarisi ditemui dan digunakan daripada C.
Pada dasarnya, teknik ini menyelesaikan masalah menyembunyikan fungsi dalam kelas terbitan dan memastikan carian nama yang betul apabila bekerja dengan fungsi terlampau beban dalam hierarki warisan.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Menyelesaikan Isu Menyembunyikan Fungsi Apabila Melebihkan Fungsi dalam Warisan C?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!