Kompilator gagal menemukan kelebihan fungsi yang benar [duplikat]
Saya memiliki kelas dasar kecil yang mendefinisikan 3 kelebihan beban untuk suatu fungsi. Overload A memanggil overload B yang merupakan virtual murni, dan implementasinya di kelas turunan memanggil overload C.
Kode lengkap saya adalah sebagai berikut:
struct Base {
int func(int a) {return func(a, a+1);}
int func(int a, int b, int c) {return a+b+c;}
virtual int func(int a, int b)=0;
};
struct Derived : public Base {
int func(int a, int b);
};
int Derived::func(int a, int b) {
return func(a,b,a+b);
}
int main(int argc, char* argv[]) {
Derived d;
d.func(1);
return 0;
}
Kode ini menghasilkan kesalahan:
test.cpp: In member function ‘virtual int Derived::func(int, int)’:
test.cpp:12:21: error: no matching function for call to ‘Derived::func(int&, int&, int)’
12 | return func(a,b,a+b);
| ^
test.cpp:11:5: note: candidate: ‘virtual int Derived::func(int, int)’
11 | int Derived::func(int a, int b) {
| ^~~~~~~
test.cpp:11:5: note: candidate expects 2 arguments, 3 provided
test.cpp: In function ‘int main(int, char**)’:
test.cpp:17:10: error: no matching function for call to ‘Derived::func(int)’
17 | d.func(1);
| ^
test.cpp:11:5: note: candidate: ‘virtual int Derived::func(int, int)’
11 | int Derived::func(int a, int b) {
| ^~~~~~~
test.cpp:11:5: note: candidate expects 2 arguments, 1 provided
Mengapa kompilator gagal menemukan kelebihan beban dua kali? (sekali dalam panggilan untuk membebani C di kelas turunan, dan sekali saat memanggil overload A di kelas utama)
Jawaban
Jika Anda mendeklarasikan fungsi di kelas turunan dengan nama yang sama seperti di kelas dasar, deklarasi di kelas turunan akan membayangi fungsi di kelas dasar.
Jadi Derived
, satu-satunya yang terlihat func
adalah (int, int)
satu - satunya.
Salah satu cara mudah untuk menyelesaikannya adalah dengan menarik fungsi kelas dasar ke set kelebihan beban using
.
struct Derived : public Base {
using Base::func; // All the func overloads are now pulled into Derived's scope
int func(int a, int b);
};