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 ?

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 ?

DDD
Libérer: 2024-12-08 08:00:22
original
1006 Les gens l'ont consulté

Why Doesn't Multiple Inheritance Support Overloaded Functions with the Same Name but Different Signatures?

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 {};
Copier après la connexion

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
}
Copier après la connexion

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;
};
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal