Maison >développement back-end >C++ >Comment résoudre la collision de noms de fonction dans l'héritage de classe dérivée C ?
Collision de nom de fonction dans l'héritage de classe dérivée
Considérez l'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); } };
Lors de la compilation de ce code , le compilateur génère l'erreur suivante :
error: no matching function for call to 'C::foo(std::string&)' candidates are: int B::foo(int)
Cette erreur se produit en raison de l’observation du nom de fonction. Lorsque la classe dérivée B définit une fonction portant le même nom qu'une fonction dans sa classe de base A, la fonction de classe dérivée masque la fonction de classe de base.
Portée de recherche de nom
La recherche de nom dans une portée de classe suit ces étapes :
Solution
Pour résoudre la collision de noms de fonction, vous pouvez re-déclarez la fonction de classe de base dans la portée de la classe dérivée. Cela garantit que les deux fonctions sont visibles dans 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); } };
En ajoutant using A::foo;, vous spécifiez que la fonction foo de la classe de base A est également disponible dans la classe dérivée. classe B. Désormais, le code sera compilé sans erreurs.
Notes supplémentaires
"Les étapes suivantes définissent le résultat de la recherche de nom dans une portée de classe, C. Tout d'abord, chaque déclaration pour le nom dans la classe et dans chacune de ses Les sous-objets de classe de base sont pris en compte. Un nom de membre f dans un sous-objet B masque un nom de membre f dans un sous-objet A si A est un sous-objet de classe de base de B."
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!