"Si un ouvrier veut bien faire son travail, il doit d'abord affûter ses outils." - Confucius, "Les Entretiens de Confucius. Lu Linggong"
Page de garde > La programmation > 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 ?

Publié le 2024-12-23
Parcourir:887

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 imposent 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 inclut 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é.

Dernier tutoriel Plus>

Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.

Copyright© 2022 湘ICP备2022001581号-3