Masquage de fonction (question d'ordre général en C++)
Bonjour,
J'ai un splendide bout de code qui ne compile pas, et je souhaite vraiment vous en faire part :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| class A
{
public:
virtual void f(int i){}
};
class B : public A
{
public:
void f(int i, int j){}
};
int main(int argc, char *argv[]){
B instance;
instance.f(42);
} |
Il y a une erreur à la ligne instance.f(42) qui dit :
Citation:
error: no matching function for call to ‘B::f(int)’
Je me dis qu'il est naturel que lorsque on appelle B::f(int), le compilo aille chercher la déclaration de la classe A (ou procède récursivement jusqu'à trouver une classe déclarant le bon prototype)
Sauf que ce n'est pas le cas. Et je voudrais savoir quelles sont les raisons qui ont poussé à cela ;)
Car, il ne me semble pas que ce soit affreux du point de vue design : on a une fonction qui renvoie des informations. Plus on se spécialise, plus on peut renvoyer des infos pertinentes, et on dispose de choix plus variés pour poser nos questions (i.e : on a plus de prototypes à notre disposition)
Je ne suis pas arrivé à trouver ma réponse sur Google, donc je m'adresse à vous!
P.S : Je ne cherche pas un workaround, honnêtement, il y a 100 façons de procéder autrement. Je veux juste savoir pourquoi les hautes instances du C++ ont décidé de limiter la portée des appels
Edit : Je persiste, je ne comprend pas pourquoi je dois faire appel à l'opérateur de résolution de portée alors qu'il n'y a pas d'ambiguïtés sur le prototype de la fonction...
Ca veut dire que la ligne suivante fonctionne :