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
Lepaskan: 2024-12-30 13:40:16
asal
631 orang telah melayarinya

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); } };
Salin selepas log masuk

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)
Salin selepas log masuk

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); } };
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan