Perlanggaran Fungsi dalam Kelas Terbitan
Apabila mentakrifkan fungsi dengan nama yang sama tetapi tandatangan berbeza dalam kelas asas dan kelas terbitannya, a Isu carian nama boleh timbul.
Pertimbangkan perkara berikut kod:
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); } };
Dalam contoh ini, pengkompil menimbulkan ralat apabila cuba mengakses fungsi foo() daripada kelas asas A dalam fungsi bar() kelas C. Ini kerana pencarian nama mengutamakan pencarian fungsi dalam kelas paling terdekat, dalam kes ini, B, dan mengabaikan fungsi yang ditindih dalam A.
Untuk menyelesaikan isu ini, kelas terbitan B mesti mengisytiharkan secara eksplisit fungsi yang diganti menggunakan arahan penggunaan:
class B : public A { public: int foo(int i){}; using A::foo; };
Dengan menggunakan arahan penggunaan, B memperkenalkan semula fungsi foo() secara berkesan daripada A ke dalam skopnya sendiri, menjadikannya kelihatan kepada terbitan berikutnya kelas seperti C.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Menyelesaikan Perlanggaran Nama Fungsi dalam Warisan C?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!