Maison >développement back-end >C++ >Comment puis-je résoudre les problèmes d'observation des fonctions dans l'héritage C ?
Frustration de l'observation des fonctions : recherche de la fonction manquante avec différentes signatures
Dans la programmation orientée objet, des conflits de noms entre les classes de base et dérivées peuvent survenir lorsque des fonctions portant le même nom mais des signatures différentes existent. Cela peut entraîner de la confusion et un comportement inattendu lors de l'exécution du code. Un tel scénario s'est produit dans le 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); } };
Lors de la tentative de compilation de ce code, une erreur est rencontrée en raison de l'impossibilité de trouver la fonction C::foo(std::string&) lors de l'appel de foo (s) dans la méthode des barres. Malgré l'existence de foo(string s) dans la classe de base A, le foo(int i) hérité dans la classe B occulte la fonction de la classe de base.
Pour résoudre ce problème et rendre la fonction souhaitée accessible, la fonction de la classe de base doit être explicitement re-déclaré dans la portée de la classe dérivée. Cela garantit que les deux fonctions sont visibles depuis la classe dérivée et ses descendants :
class A { public: void foo(string s); }; class B : public A { public: int foo(int i); using A::foo; }; class C : public B { public: void bar() { string s; foo(s); } };
Il est important de noter que la recherche de nom dans les étendues de classe donne la priorité aux déclarations de la classe actuelle et élimine les déclarations cachées de la sous-classe de base. -des objets. Par conséquent, l'introduction d'une fonction avec le même nom mais une signature différente dans une classe dérivée peut obscurcir la fonction de la classe de base, conduisant à l'erreur décrite.
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!