Berbilang Fungsi Diwarisi dengan Tandatangan Sama Tidak Terlebih Beban
Dalam pengaturcaraan berorientasikan objek, warisan membenarkan kelas mewarisi sifat dan kaedah daripada kelas induk. Walau bagaimanapun, isu biasa timbul apabila berbilang kelas yang diwarisi mempunyai fungsi dengan nama yang sama tetapi tandatangan berbeza.
Masalah
Pertimbangkan coretan kod berikut:
#include <iostream> struct Base1 { void foo(int); }; struct Base2 { void foo(float); }; struct Derived : public Base1, public Base2 { }; int main() { Derived d; d.foo(5); // Ambiguous call to "foo" std::cin.get(); return 0; }
Kod ini menghasilkan ralat "ambiguous call to foo", yang menunjukkan bahawa panggilan to foo tidak boleh diselesaikan kerana terdapat berbilang fungsi yang diwarisi dengan nama yang sama tetapi tandatangan yang berbeza.
Penjelasan
Mengikut peraturan carian ahli C, apabila kelas mewarisi daripada berbilang asas kelas dan terdapat berbilang pengisytiharan untuk nama yang sama, sebarang pengisytiharan tersembunyi akan dihapuskan. Jika set pengisytiharan yang terhasil adalah daripada jenis yang berbeza atau termasuk ahli bukan statik daripada kelas asas yang berbeza, kekaburan berlaku.
Dalam contoh di atas, kedua-dua Base1 dan Base2 mentakrifkan fungsi foo, tetapi mereka mempunyai tandatangan yang berbeza. Apabila Terbitan mewarisi daripada Base1 dan Base2, terdapat dua pengisytiharan berbeza untuk foo dengan jenis yang berbeza. Ini mengakibatkan kekaburan, menyebabkan ralat kompilasi.
Penyelesaian
Untuk menyelesaikan kekaburan, anda boleh menggunakan menggunakan pengisytiharan untuk menentukan versi kelas asas foo yang hendak digunakan. Contohnya:
class Derived : public Base1, public Base2 { using Base1::foo; };
Ini menggunakan pengisytiharan memastikan bahawa fungsi foo daripada Base1 digunakan dalam Derived.
Gotcha
Perhatikan bahawa dalam coretan kod kedua yang anda berikan, kelas Terbitan hanya mempunyai satu fungsi foo (dengan parameter apungan). Ini kerana fungsi foo daripada Base1 disembunyikan oleh fungsi foo daripada Derived. Oleh itu, d.foo(5) memanggil fungsi foo dengan parameter apungan daripada Derived, bukan Base1.
Jadi, untuk menjawab soalan dalam tajuk, berbilang fungsi yang diwarisi dengan nama yang sama tetapi tandatangan berbeza tidak dianggap sebagai fungsi terlebih beban kerana ia akan mengakibatkan kekaburan. Sebaliknya, pengkompil memerlukan resolusi eksplisit menggunakan pengisytiharan atau teknik lain untuk menentukan fungsi yang harus digunakan.
Atas ialah kandungan terperinci Bagaimanakah Pelbagai Fungsi Diwarisi dengan Nama Yang Sama tetapi Tandatangan Berbeza Menyelesaikan dalam C?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!