Rumah >pembangunan bahagian belakang >C++ >Bagaimana untuk Menyelesaikan Perlanggaran Nama Fungsi dalam Warisan Kelas Terbitan C?
Perlanggaran Nama Fungsi dalam Warisan Kelas Terbitan
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); } };
Apabila menyusun kod ini , pengkompil menjana yang berikut ralat:
error: no matching function for call to 'C::foo(std::string&)' candidates are: int B::foo(int)
Ralat ini berlaku kerana pembayang nama fungsi. Apabila kelas terbitan B mentakrifkan fungsi dengan nama yang sama seperti fungsi dalam kelas asasnya A, fungsi kelas terbitan membayangi fungsi kelas asas.
Skop Carian Nama
Pencarian nama dalam skop kelas mengikut langkah berikut:
Penyelesaian
Untuk menyelesaikan masalah perlanggaran nama fungsi, anda boleh mengisytiharkan semula fungsi kelas asas dalam skop kelas terbitan. Ini memastikan bahawa kedua-dua fungsi boleh dilihat 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); } };
Dengan menambahkan menggunakan A::foo;, anda menentukan bahawa fungsi foo daripada kelas asas A juga tersedia dalam terbitan kelas B. Sekarang, kod akan disusun tanpa ralat.
Tambahan Nota
"Langkah berikut mentakrifkan hasil carian nama dalam skop kelas, C. Pertama, setiap pengisytiharan untuk nama dalam kelas dan dalam setiap sub-objek kelas asasnya dipertimbangkan A nama ahli f dalam satu sub-objek B menyembunyikan nama ahli f dalam sub-objek A jika A ialah sub-objek kelas asas B."
Atas ialah kandungan terperinci Bagaimana untuk Menyelesaikan Perlanggaran Nama Fungsi dalam Warisan Kelas Terbitan C?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!