Kekecewaan Membayangi Fungsi: Mencari Fungsi yang Hilang dengan Tandatangan Berbeza
Dalam pengaturcaraan berorientasikan objek, konflik penamaan antara kelas asas dan turunan boleh timbul apabila fungsi dengan nama yang sama tetapi tandatangan berbeza wujud. Ini boleh menyebabkan kekeliruan dan tingkah laku yang tidak dijangka semasa pelaksanaan kod. Senario sedemikian berlaku dalam 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); } };
Apabila cuba menyusun kod ini, ralat berlaku disebabkan ketidakupayaan untuk mencari fungsi C::foo(std::string&) apabila memanggil foo (s) dalam kaedah bar. Walaupun wujud foo(rentetan s) dalam kelas asas A, foo(int i) yang diwarisi dalam kelas B membayangi fungsi kelas asas.
Untuk menyelesaikan isu ini dan menjadikan fungsi yang diingini boleh diakses, fungsi daripada kelas asas mesti diisytiharkan semula secara eksplisit dalam skop kelas terbitan. Ini memastikan bahawa kedua-dua fungsi boleh dilihat dari dalam kelas terbitan dan keturunannya:
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); } };
Adalah penting untuk ambil perhatian bahawa carian nama dalam skop kelas mengutamakan pengisytiharan dari dalam kelas semasa dan menghapuskan pengisytiharan tersembunyi daripada sub kelas asas -objek. Oleh itu, pengenalan fungsi dengan nama yang sama tetapi tandatangan yang berbeza dalam kelas terbitan boleh mengaburkan fungsi kelas asas, yang membawa kepada ralat yang diterangkan.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Menyelesaikan Isu Bayangan Fungsi dalam Warisan C?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!