Rumah >pembangunan bahagian belakang >C++ >Mengapakah C Memerlukan Penggantian Eksplisit untuk Kaedah Kelas Asas?
Dalam pengaturcaraan berorientasikan objek, resolusi beban lampau ialah mekanisme penting yang membolehkan pemilihan kaedah yang betul apabila berbilang kaedah dengan nama yang sama tetapi parameter berbeza wujud dalam hierarki kelas. Walau bagaimanapun, tingkah laku peleraian lebihan dalam C kadangkala memerlukan panduan tambahan daripada pengaturcara.
Pertimbangkan contoh berikut:
class A { public: int DoSomething() { return 0; }; }; class B : public A { public: int DoSomething(int x) { return 1; }; }; int main() { B* b = new B(); b->A::DoSomething(); // Explicit call to base class method // b->DoSomething(); // Compiler error: DoSomething() is ambiguous delete b; return 0; }
Dalam contoh ini, dua kaedah bernama "DoSomething" wujud: satu dalam kelas asas A dan satu dalam kelas terbitan B. Resolusi beban lampau harus secara automatik menentukan kaedah yang hendak digunakan berdasarkan senarai konteks dan hujah. Walau bagaimanapun, dalam kes ini, pengkompil menjana ralat untuk baris kedua.
Ini kerana, secara lalai, C hanya mempertimbangkan skop terkecil yang mungkin untuk padanan nama. Dalam contoh ini, pengkompil melihat kaedah DoSomething(int) dalam kelas terbitan B dan cuba memadankannya dengan senarai argumen, yang gagal. Kaedah dalam kelas asas A tidak dipertimbangkan sehingga selepas langkah padanan nama.
Untuk menyelesaikan kekaburan ini, seseorang mesti menyatakan secara eksplisit kaedah kelas asas menggunakan sintaks b->A::DoSomething(). Ini secara jelas memberitahu pengkompil bahawa kaedah dalam kelas asas harus digunakan, walaupun terdapat kaedah dengan nama yang sama dalam kelas terbitan.
Sebagai alternatif, seseorang boleh menggunakan pengisytiharan menggunakan untuk membawa kelas asas kaedah ke dalam skop kelas terbitan, seperti:
class B : public A { public: using A::DoSomething; // … };
Ini membenarkan kaedah DoSomething() daripada A dipanggil tanpa awalan A:: eksplisit. Walau bagaimanapun, adalah penting untuk ambil perhatian bahawa penyelesaian ini mungkin mempunyai implikasi untuk kaedah maya lain dalam hierarki kelas.
Atas ialah kandungan terperinci Mengapakah C Memerlukan Penggantian Eksplisit untuk Kaedah Kelas Asas?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!