Der Compiler findet keine richtige Funktionsüberladung [Duplikat]
Ich habe eine kleine Basisklasse, die 3 Überladungen für eine Funktion definiert. Überladung A ruft Überladung B auf, die rein virtuell ist, und ihre Implementierung in der abgeleiteten Klasse ruft Überladung C auf.
Mein vollständiger Code lautet wie folgt:
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;
}
Dieser Code liefert die Fehler:
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
Warum findet der Compiler nicht zweimal die richtige Überladung? (einmal beim Aufruf zur Überladung von C in der abgeleiteten Klasse und einmal beim Aufruf von Überladung A in der Hauptklasse)
Antworten
Wenn Sie eine Funktion in einer abgeleiteten Klasse mit demselben Namen wie in der Basisklasse deklarieren, werden die Funktionen in der Basisklasse durch die Deklaration in der abgeleiteten Klasse beschattet.
Also Derived
, die nur sichtbar func
ist das (int, int)
eine.
Eine einfache Möglichkeit, dies zu lösen, besteht darin, die Funktionen der Basisklasse in den Überlastungssatz mit zu ziehen 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);
};