Maison >développement back-end >C++ >Comment plusieurs fonctions héritées avec des noms identiques mais des signatures différentes sont-elles résolues en C ?

Comment plusieurs fonctions héritées avec des noms identiques mais des signatures différentes sont-elles résolues en C ?

Susan Sarandon
Susan Sarandonoriginal
2024-12-14 00:04:14557parcourir

How Do Multiple Inherited Functions with Identical Names but Different Signatures Resolve in C  ?

Fonctions héritées multiples avec la même signature non surchargées

Dans la programmation orientée objet, l'héritage permet aux classes d'hériter des propriétés et des méthodes des classes parents. Cependant, un problème courant survient lorsque plusieurs classes héritées ont des fonctions portant le même nom mais des signatures différentes.

Problème

Considérez l'extrait de code suivant :

#include <iostream>

struct Base1 {
    void foo(int);
};

struct Base2 {
    void foo(float);
};

struct Derived : public Base1, public Base2 {
};

int main() {
    Derived d;
    d.foo(5); // Ambiguous call to "foo"

    std::cin.get();
    return 0;
}

Ce code produit une erreur "appel ambigu à foo", indiquant que l'appel à foo ne peut pas être résolu car il existe plusieurs fonctions héritées avec le même nom mais des signatures différentes.

Explication

Selon les règles de recherche de membres C, lorsqu'une classe hérite de plusieurs classes de base et qu'il existe plusieurs déclarations pour la même nom, toutes les déclarations cachées sont éliminées. Si l'ensemble de déclarations résultant provient de types différents ou inclut des membres non statiques de classes de base distinctes, une ambiguïté se produit.

Dans l'exemple ci-dessus, Base1 et Base2 définissent une fonction foo, mais elles ont des signatures différentes. Lorsque Derived hérite de Base1 et Base2, il existe deux déclarations distinctes pour foo avec des types différents. Cela entraîne une ambiguïté, provoquant une erreur de compilation.

Solution

Pour résoudre l'ambiguïté, vous pouvez utiliser des déclarations using pour spécifier la version de foo de la classe de base à utiliser. Par exemple :

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

Cette déclaration using garantit que la fonction foo de Base1 est utilisée dans Derived.

Gotcha

Notez que dans le deuxième extrait de code que vous avez fourni, la classe Derived n'a qu'une seule fonction foo (avec un paramètre float). En effet, la fonction foo de Base1 est masquée par la fonction foo de Derived. Par conséquent, d.foo(5) appelle la fonction foo avec un paramètre float de Derived, pas de Base1.

Donc, pour répondre à la question dans le titre, plusieurs fonctions héritées avec le même nom mais des signatures différentes ne sont pas traitées comme des fonctions surchargées car cela entraînerait une ambiguïté. Au lieu de cela, le compilateur nécessite une résolution explicite à l'aide de déclarations ou d'autres techniques pour spécifier quelle fonction doit être utilisée.

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!

Déclaration:
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