Kompilator gagal menemukan kelebihan fungsi yang benar [duplikat]

Dec 11 2020

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

2 super Dec 11 2020 at 12:42

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 funcadalah (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);
};