A::DoSomething()` bukannya `b->DoSomething()` apabila memanggil kaedah daripada kelas induk dalam C ? " />
C Overload Resolution for Skop Konflik
Coretan kod yang disediakan menggambarkan cabaran biasa dalam C overload resolusi apabila dua kaedah dengan nama yang sama wujud dalam skop berbeza . Dalam senario ini, pengkompil bergantung pada peraturan keterlihatan skop untuk menentukan kaedah yang berkenaan.
Masalah:
Apabila menggunakan kaedah DoSomething pada contoh kelas B , mengapakah perlu menggunakan b->A::DoSomething() secara eksplisit dan bukannya b->DoSomething()?
Jawapan:
The pengkompil lalai untuk mempertimbangkan skop nama terkecil yang mungkin, dan dalam kes ini, ia hanya mengenali kaedah DoSomething yang ditakrifkan dalam kelas B. Memandangkan senarai argumen tidak sepadan dengan tandatangan kaedah ini, pengkompil mengeluarkan ralat.
Kepada selesaikan isu skop ini, terdapat dua pendekatan:
Resolusi Skop Eksplisit:
Tentukan secara eksplisit skop kaedah yang diingini menggunakan sintaks b->A:: DoSomething(), yang memaksa pengkompil mengenali kaedah yang ditakrifkan dalam kelas A.
Mewarisi Skop:
Gunakan arahan penggunaan untuk membawa kaedah yang diingini ke dalam skop daripada kelas terbitan. Contohnya:
<code class="cpp">class B : public A { public: using A::DoSomething; // ... }</code>
Dengan menggunakan salah satu daripada kaedah ini, anda boleh memastikan bahawa pengkompil menyelesaikan beban berlebihan dengan betul dan menggunakan kaedah DoSomething yang dimaksudkan.
Atas ialah kandungan terperinci Mengapa saya perlu menggunakan `b->A::DoSomething()` dan bukannya `b->DoSomething()` apabila memanggil kaedah daripada kelas induk dalam C ?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!