Le compilateur ne parvient pas à trouver la bonne surcharge de fonction [dupliquer]
J'ai une petite classe de base qui définit 3 surcharges pour une fonction. La surcharge A appelle la surcharge B qui est purement virtuelle, et son implémentation dans la classe dérivée appelle la surcharge C.
Mon code complet est le suivant:
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;
}
Ce code génère les erreurs:
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
Pourquoi le compilateur ne parvient-il pas à trouver la surcharge correcte deux fois? (une fois dans l'appel de surcharge C dans la classe dérivée, et une fois lors de l'appel de surcharge A dans le main)
Réponses
Si vous déclarez une fonction dans une classe dérivée avec le même nom que dans la classe de base, la déclaration dans la classe dérivée suivra les fonctions de la classe de base.
Donc Derived
, le seul visible func
est (int, int)
celui.
Un moyen simple de résoudre ce problème consiste à extraire les fonctions de classe de base dans le jeu de surcharge avec 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);
};