Maison >développement back-end >C++ >Pourquoi l'héritage multiple ne prend-il pas en charge les fonctions surchargées avec le même nom mais des signatures différentes ?
Fonctions surchargées avec héritage multiple
En C, la surcharge de fonctions permet de définir plusieurs fonctions portant le même nom dans une seule portée, à condition ils ont des listes de paramètres différentes. Toutefois, ce comportement ne s’étend pas aux fonctions héritées de plusieurs fois portant le même nom mais des signatures différentes. Cela soulève la question : pourquoi de telles fonctions ne sont-elles pas traitées comme surchargées ?
Selon la section 10.2/2 de la norme C, les règles de recherche de membres exigent que les déclarations cachées soient éliminées de la considération lors de la recherche de nom. Lorsque plusieurs classes de base définissent des fonctions portant le même nom mais des paramètres différents, ces fonctions peuvent être masquées les unes des autres. Par conséquent, si l'ensemble de déclarations résultant ne provient pas de sous-objets du même type, ou comprend un membre non statique et des membres de sous-objets différents, une ambiguïté surgit et le programme est considéré comme mal formé.
Par exemple :
class A { public: int f(int); }; class B { public: int f(); }; class C : public A, public B {};
Dans ce cas, f est ambigu car il est défini dans deux classes de base différentes (A et B). Par conséquent, l'appel suivant à f depuis la classe C est incorrect :
int main() { C c; c.f(); // ambiguous }
Pour résoudre cette ambiguïté, vous pouvez utiliser la déclaration using pour spécifier quelle classe de base implémente la fonction f. Par exemple :
class C : public A, public B { using A::f; using B::f; };
Avec cette modification, c.f() appelle désormais explicitement f à partir de la classe A, résolvant ainsi l'ambiguïté.
En revanche, le deuxième exemple de code que vous avez fourni fonctionne car foo( float) est défini dans la portée de la classe Derived et n'est pas hérité de plusieurs classes de base. Par conséquent, d.foo(5) appelle directement la fonction foo(float), 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!