Rumah >pembangunan bahagian belakang >C++ >Bagaimana untuk Menyelesaikan Perlanggaran Nama Fungsi dalam Warisan Kelas Terbitan C?

Bagaimana untuk Menyelesaikan Perlanggaran Nama Fungsi dalam Warisan Kelas Terbitan C?

Patricia Arquette
Patricia Arquetteasal
2024-12-30 13:40:16627semak imbas

How to Resolve Function Name Collision in C   Derived Class Inheritance?

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:

  1. Pertimbangkan semua pengisytiharan untuk nama dalam kelas dan kelas asasnya.
  2. Hapuskan sebarang pengisytiharan yang disembunyikan oleh pengisytiharan lain dalam kelas asas.

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

  • Standard mentakrifkan carian nama dalam skop kelas seperti berikut:
"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."
  • Pencarian nama berlaku sebelum kawalan akses. Oleh itu, walaupun fungsi foo dalam B adalah peribadi, fungsi foo dalam A masih tidak akan ditemui.

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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn