98 votes

Fonction avec le même nom mais une signature différente dans la classe dérivée

J'ai une fonction avec le même nom, mais avec une signature différente dans une base et les classes dérivées. Lorsque j'essaie d'utiliser la classe de base est fonction d'une autre classe qui hérite de la dérivée, j'ai un message d'erreur. Voir le 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);
    }
};

Je reçois l'erreur suivante dans le compilateur gcc:

In member function `void C::bar()': no matching function for call to `C::foo(std::string&)' candidates are: int B::foo(int)

Si je supprime int foo(int i){}; la classe B, ou si je le renommer en toto1, tout fonctionne bien.

Quel est le problème?

Je vous remercie.

113voto

C'est parce que la recherche du nom de cesse que si elle trouve un nom dans l'une de vos bases. Il ne sera pas regarder au-delà dans d'autres bases. La fonction B ombres de la fonction dans A. Vous devez re-déclarer la fonction de l'Un dans le champ d'application de B, de sorte que les deux fonctions sont visibles de l'intérieur de B et C:

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

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

class C : public B
{
    public:
    void bar()
    {
        string s;
        foo(s);
    }
};

Edit: La véritable description de la Norme donne est (de 10,2/2):

Les étapes suivantes de définir le résultat de recherche d'un nom dans un contexte de classe, C. tout d'Abord, chaque déclaration pour l' nom de la classe et dans chacune de ses de la classe de base des sous-objets est considéré comme. Un nom de membre f au sein d'une sous- l'objet B se cache le nom d'un membre de f dans un sous-objet de A si A est une classe de base sous-objet de B. déclarations qui sont donc cachés sont éliminés de l'examen. Chacune de ces déclarations, qui a été introduite par un à l'aide de déclaration est considéré être de chaque sous-objet de C qui est du type de contenant la déclaration tion désigné par l'aide-déclaration.96) Si l'ensemble des déclarations ne sont pas tous de sous-objets du même type, ou l'ensemble a un membre non statique et comprend des membres provenant de différents sous-objets, il est une ambiguïté et le programme est mal formé. Sinon, cet ensemble est le résultat de la recherche.

Il est la suivante-à-dire dans un autre endroit (juste au dessus):

Pour un id-expression [quelque chose comme "foo"], recherche de nom commence dans le domaine de la classe de cela, qualifiés-id [quelque chose comme "A::foo", A est un sous-nom-spécificateur], la recherche d'un nom commence dans le champ d'application de la nested-nom-rédacteur de devis. La recherche d'un nom qui se déroule avant le contrôle d'accès (3.4, article 11).

([...] mis par moi). Notez que cela signifie que même si votre foo dans B est privé, les foo dans Une sera pas encore trouvé (parce que le contrôle d'accès se produit plus tard).

86voto

Charles Bailey Points 244082

Fonctions dans les classes dérivées qui ne supplantent pas les fonctions dans les classes de base, mais qui ont le même nom de masquer les autres fonctions du même nom dans la classe de base.

Il est généralement considéré comme une mauvaise pratique à avoir des fonctions dans les classes dérivées qui ont le même nom que les fonctions dans la basse classe, qui ne sont pas destinés à remplacer la classe de base fonctionne comme ce que vous voyez n'est généralement pas souhaitable de comportement. Il est généralement préférable de donner les différentes fonctions des noms différents.

Si vous devez appeler la fonction de base, vous aurez besoin à portée de l'appel à l'aide d' A::foo(s). Notez que cela permettrait également de désactiver toute fonction virtuelle mécanisme A::foo(string) dans le même temps.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X