Maison >développement back-end >C++ >Pourquoi « Fonction avec le même nom mais une signature différente dans la classe dérivée introuvable » se produit-elle dans l'héritage C ?

Pourquoi « Fonction avec le même nom mais une signature différente dans la classe dérivée introuvable » se produit-elle dans l'héritage C ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-12-21 03:40:09741parcourir

Why Does

Masquage de fonction dans les hiérarchies de classes : compréhension de l'erreur "Fonction avec le même nom mais signature différente dans la classe dérivée introuvable"

Dans la programmation orientée objet, les classes dérivées peuvent hériter membres de leurs classes de base. Toutefois, des problèmes peuvent survenir lorsque des fonctions portant le même nom mais des signatures différentes existent dans les classes de base et dérivées. Cela peut entraîner des erreurs telles que "Fonction avec le même nom mais signature différente dans la classe dérivée introuvable."

Pour illustrer ce problème, considérez l'extrait de code suivant :

class A {
public:
    void foo(string s) {}
};

class B : public A {
public:
    int foo(int i) {}
};

class C : public B {
public:
    void bar() {
        string s;
        foo(s); // Error: no matching function
    }
};

Lors de la compilation ce code, le compilateur rencontre une erreur dans l'appel foo(s) dans la fonction bar() de la classe C. Bien que la fonction foo(string s) soit présente dans la classe de base A, le compilateur ne parvient pas à reconnaissez-le grâce à un phénomène connu sous le nom de masquage de fonction.

Dans ce scénario, la fonction foo(int i) définie dans la classe B masque la fonction foo(string s) héritée de la classe A . En effet, la recherche de nom dans les hiérarchies de classes s'arrête à la première déclaration d'un nom correspondant. Ainsi, lorsque le processus de recherche atteint la classe B, il trouve la fonction foo(int i) et ignore la fonction foo(string s) remplacée dans la classe de base.

Pour résoudre ce problème, il faut explicitement redéclarer le fonction de classe de base dans la portée de la classe dérivée. En utilisant le mot-clé using pour hériter de la fonction de classe de base, les deux fonctions deviennent visibles dans la classe dérivée et ses sous-classes :

class A {
public:
    void foo(string s) {}
};

class B : public A {
public:
    int foo(int i) {}
    using A::foo; // Redeclare base class foo function
};

class C : public B {
public:
    void bar() {
        string s;
        foo(s); // Now finds the base class foo(string s)
    }
};

En incorporant cette ligne dans la classe B, la recherche de nom considérera correctement à la fois le foo( int i) et foo(string s), résolvant le problème de masquage des fonctions.

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