Fonctions héritées multiples avec la même signature non surchargées
Dans la programmation orientée objet, l'héritage permet aux classes d'hériter des propriétés et des méthodes des classes parents. Cependant, un problème courant survient lorsque plusieurs classes héritées ont des fonctions portant le même nom mais des signatures différentes.
Problème
Considérez l'extrait de code suivant :
#include <iostream> struct Base1 { void foo(int); }; struct Base2 { void foo(float); }; struct Derived : public Base1, public Base2 { }; int main() { Derived d; d.foo(5); // Ambiguous call to "foo" std::cin.get(); return 0; }
Ce code produit une erreur "appel ambigu à foo", indiquant que l'appel à foo ne peut pas être résolu car il existe plusieurs fonctions héritées avec le même nom mais des signatures différentes.
Explication
Selon les règles de recherche de membres C, lorsqu'une classe hérite de plusieurs classes de base et qu'il existe plusieurs déclarations pour la même nom, toutes les déclarations cachées sont éliminées. Si l'ensemble de déclarations résultant provient de types différents ou inclut des membres non statiques de classes de base distinctes, une ambiguïté se produit.
Dans l'exemple ci-dessus, Base1 et Base2 définissent une fonction foo, mais elles ont des signatures différentes. Lorsque Derived hérite de Base1 et Base2, il existe deux déclarations distinctes pour foo avec des types différents. Cela entraîne une ambiguïté, provoquant une erreur de compilation.
Solution
Pour résoudre l'ambiguïté, vous pouvez utiliser des déclarations using pour spécifier la version de foo de la classe de base à utiliser. Par exemple :
class Derived : public Base1, public Base2 { using Base1::foo; };
Cette déclaration using garantit que la fonction foo de Base1 est utilisée dans Derived.
Gotcha
Notez que dans le deuxième extrait de code que vous avez fourni, la classe Derived n'a qu'une seule fonction foo (avec un paramètre float). En effet, la fonction foo de Base1 est masquée par la fonction foo de Derived. Par conséquent, d.foo(5) appelle la fonction foo avec un paramètre float de Derived, pas de Base1.
Donc, pour répondre à la question dans le titre, plusieurs fonctions héritées avec le même nom mais des signatures différentes ne sont pas traitées comme des fonctions surchargées car cela entraînerait une ambiguïté. Au lieu de cela, le compilateur nécessite une résolution explicite à l'aide de déclarations ou d'autres techniques pour spécifier quelle fonction doit être utilisée.
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!