Surcharge de fonctions dans l'héritage : compréhension des fonctions caché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, lors de la définition de fonctions portant le même nom mais des signatures différentes dans les classes de base et dérivées, la recherche de nom peut devenir ambiguë, entraînant des erreurs.
Problème :
Considérez le extrait de code suivant :
class A { public: void foo(string s){}; }; class B : public A { public: int foo(int i){}; }; class C : public B { public: void bar() { string s; foo(s); // Error: member function not found } };
Lors de la tentative d'appel de la fonction foo remplacée dans la classe dérivée C, le compilateur rencontre une erreur car la recherche de nom s'arrête à la classe dérivée B et ne peut pas trouver le foo hérité de la classe de base A.
Solution :
Pour résoudre ce problème, la fonction de la classe de base doit être explicitement déclaré dans la portée de la classe dérivée à l'aide du mot clé using. Cela rend les deux fonctions visibles depuis l'intérieur de la classe dérivée.
class A { public: void foo(string s){}; }; class B : public A { public: int foo(int i){}; using A::foo; // Re-declare function from base class }; class C : public B { public: void bar() { string s; foo(s); // Now calls the inherited 'foo' function } };
Explication :
La recherche de nom dans l'héritage est hiérarchique. Par défaut, la recherche de nom donne la priorité aux fonctions définies dans la classe dérivée. Dans l'exemple ci-dessus, lorsque foo(s) est appelé en C, le compilateur recherche d'abord une fonction correspondante en C, puis en B et enfin en A. Cependant, puisque B a sa propre fonction foo, la recherche s'arrête là : entraînant l'erreur.
En déclarant explicitement la fonction foo de la classe de base dans B à l'aide de A::foo, le compilateur est invité à prendre en compte les deux fonctions lors de la recherche de nom. Cela permet de trouver et d'invoquer la fonction foo héritée à partir de C.
Essentiellement, cette technique résout le problème du masquage des fonctions dans les classes dérivées et garantit une recherche de nom correcte lorsque vous travaillez avec des fonctions surchargées dans les hiérarchies d'héritage.
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!