problème c++ avec surcharge de fonction dans une classe héritée

C'est peut-être une question de noob, désolé. J'ai eu à faire face à un problème bizarre récemment en essayant de faire le tri avec des trucs de haut niveau en c++, la surcharge de fonctions et l'héritage.

je vais vous montrer un exemple simple, juste pour montrer le problème;

il y a deux classes, classA et classB , comme ci-dessous;

class classA{
    public:
        void func(char[]){};    
};

class classB:public classA{ 
    public:
        void func(int){};
};

selon ce que je sais classB devrait maintenant posséder deux func(..) fonctions, surchargé en raison de différents arguments.

mais en essayant cela dans la méthode principale;

int main(){
    int a;
    char b[20];
    classB objB;
    objB.func(a);    //this one is fine
    objB.func(b);    //here's the problem!
    return 0;
}

il donne des erreurs comme la méthode void func(char[]){}; qui est dans la classe super, classA , n'est pas visible dans la classe dérivée, classB .

Comment puis-je surmonter cela? n'est-ce pas comme ça que la surcharge fonctionne en c++? Je suis nouveau en c++ mais en Java, je sais que je peux utiliser quelque chose comme ça.

bien que j'ai déjà trouvé ce fil qui pose des questions sur des questions similaires, je pense que les deux cas sont différents.

30
demandé sur Community 2013-01-08 13:47:47

4 réponses

Tout ce dont vous avez besoin est un using :

class classB:public classA{ 
    public:
        using classA::func;
        void func(int){};
};

il ne Recherche pas la classe de base pour func car il en a déjà trouvé une dans la classe dérivée. L'énoncé using ramène l'autre surcharge dans la même portée afin qu'elle puisse participer à la résolution de surcharge.

44
répondu chris 2013-01-08 10:01:33

elle est bien expliquée par exemple dans les réponses à cette question:

Pourquoi devrais-je utiliser le mot-clé "utiliser" pour accéder à la méthode de la classe de base?

en bref, le compilateur va arrêter la recherche de méthodes correspondantes à partir des classes mères, quand il trouve le nom de la méthode correspondante dans la classe courante, même si cette méthode n'est pas compatible. Je suppose que cela permet à certains types de conversions automatiques de fonctionner plus logiquement, sans avoir à outrepasser tant de méthodes de la classe mère.

10
répondu hyde 2017-05-23 12:26:08

Si vous remplacez une variante d'une fonction dans la classe dérivée, vous devez remplacer toutes les variantes. Vous pouvez utiliser ce que JLledo a suggéré ou écrire la variante de la fonction dans la classe dérivée qui appelle simplement la fonction de la classe de base de la même signature.

class classA{
    public:
        void func(char[]){};    
};

class classB:public classA{ 
    public:
        void func(int){};
        void func(char[]){};
};

void classB:func(char[] ch)
{
    classA::func(ch);
}
3
répondu Girish Matti 2013-01-10 02:55:00

vous devez passer l'argument de type int dans

objB.func(b);    //here's the problem!

bcs il a été surchargé avec des argument int

-4
répondu ashish raj 2014-02-13 09:10:31