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
Libérer: 2024-12-21 03:40:09
original
747 Les gens l'ont consulté

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

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

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!

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