Maison > développement back-end > C++ > Pourquoi plusieurs fonctions héritées portant le même nom ne sont-elles pas surchargées en C ?

Pourquoi plusieurs fonctions héritées portant le même nom ne sont-elles pas surchargées en C ?

Patricia Arquette
Libérer: 2024-12-21 16:17:09
original
604 Les gens l'ont consulté

Why Don't Multiple Inherited Functions with the Same Name Overload in C  ?

Fonctions héritées multiples avec le même nom : pourquoi ne pas être surchargées ?

En C, lorsque plusieurs classes héritent de fonctions portant le même nom mais des signatures différentes , le compilateur traite ces fonctions comme des membres distincts plutôt que comme des fonctions surchargées. Cela conduit à une ambiguïté lors de l'appel des fonctions à partir d'une classe dérivée.

Considérons l'exemple suivant :

struct Base1 {
  void foo(int);
};

struct Base2 {
  void foo(float);
};

struct Derived : public Base1, public Base2 {
};
Copier après la connexion

Ici, Base1 et Base2 définissent une fonction nommée foo avec des paramètres différents. Lors de l'appel de d.foo(5) à partir de la classe dérivée Derived, le compilateur génère une erreur "appel ambigu".

Contrairement à la substitution, qui nécessite que les signatures des fonctions soient identiques, la surcharge autorise les fonctions portant le même nom mais différents paramètres. Cependant, cette règle ne s'applique pas à plusieurs fonctions héritées.

Selon les règles de recherche de membres C, lorsque plusieurs déclarations du même nom de membre existent dans une classe dérivée, les déclarations de différentes classes de base sont considérées comme ambiguës. Cela se produit lorsque les déclarations ne proviennent pas toutes de sous-objets du même type ou lorsqu'il existe un membre non statique issu de sous-objets distincts.

Pour résoudre cette ambiguïté, vous pouvez utiliser la déclaration using pour spécifier explicitement quelle fonction de la classe de base doit être appelée :

struct Derived : public Base1, public Base2 {
  using Base1::foo;
  using Base2::foo;
};

int main() {
  Derived d;
  d.foo(5); // Calls Base1::foo(int)
  d.foo(5.0f); // Calls Base2::foo(float)
}
Copier après la connexion

Dans le deuxième extrait de code que vous avez fourni :

struct Base {
  void foo(int);
};

struct Derived : public Base {
  void foo(float);
};
Copier après la connexion

La fonction foo(float) dans Derived remplace la fonction foo(int) dans la classe de base. Par conséquent, lors de l'appel de d.foo(5), la fonction foo(float) est invoquée correctement 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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal