Fonctions héritées multiples avec le même nom : pourquoi ne pas être surchargées ?
En C, lorsque plusieurs classes héritent de fonctions portant le même nom mais des signatures différentes , le compilateur traite ces fonctions comme des membres distincts plutôt que comme des fonctions surchargées. Cela conduit à une ambiguïté lors de l'appel des fonctions à partir d'une classe dérivée.
Considérons l'exemple suivant :
struct Base1 { void foo(int); }; struct Base2 { void foo(float); }; struct Derived : public Base1, public Base2 { };
Ici, Base1 et Base2 définissent une fonction nommée foo avec des paramètres différents. Lors de l'appel de d.foo(5) à partir de la classe dérivée Derived, le compilateur génère une erreur "appel ambigu".
Contrairement à la substitution, qui nécessite que les signatures des fonctions soient identiques, la surcharge autorise les fonctions portant le même nom mais différents paramètres. Cependant, cette règle ne s'applique pas à plusieurs fonctions héritées.
Selon les règles de recherche de membres C, lorsque plusieurs déclarations du même nom de membre existent dans une classe dérivée, les déclarations de différentes classes de base sont considérées comme ambiguës. Cela se produit lorsque les déclarations ne proviennent pas toutes de sous-objets du même type ou lorsqu'il existe un membre non statique issu de sous-objets distincts.
Pour résoudre cette ambiguïté, vous pouvez utiliser la déclaration using pour spécifier explicitement quelle fonction de la classe de base doit être appelée :
struct Derived : public Base1, public Base2 { using Base1::foo; using Base2::foo; }; int main() { Derived d; d.foo(5); // Calls Base1::foo(int) d.foo(5.0f); // Calls Base2::foo(float) }
Dans le deuxième extrait de code que vous avez fourni :
struct Base { void foo(int); }; struct Derived : public Base { void foo(float); };
La fonction foo(float) dans Derived remplace la fonction foo(int) dans la classe de base. Par conséquent, lors de l'appel de d.foo(5), la fonction foo(float) est invoquée correctement sans aucune ambiguïté.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!