IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Autres éditeurs Discussion :

[G++] Héritage et surcharge de fonction


Sujet :

Autres éditeurs

  1. #1
    Membre éprouvé

    Homme Profil pro
    Inscrit en
    Mars 2003
    Messages
    291
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 291
    Points : 1 059
    Points
    1 059
    Par défaut [G++] Héritage et surcharge de fonction
    Bonjour c'est encore moi,
    j'ai un nouveau problème, j'ai cherché sur le net, sur la FAQ et sur le forum, je ne trouve pas pourquoi ça ne marche pas. Le compilo me dit que je n'ai pas de méthode qui prend un string en paramètre... Pourtant j'en ai une définie dans la classe mère. D'où ça vient, c'est un problème avec la surcharge et l'héritage ? Comment faire ? (je me doute que j'ai encore du faire une grosse bourde mais il y a longtemps que je n'ai pas fait de C++...)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
     
     
    class c1
    {
        public:
            virtual void func() { cout << "func"; }
            virtual void test(const char* c)= 0;
            virtual void test(const string &c) { test(c.c_str()); }
            virtual ~c1() { }
    };
     
    class c2 : public c1
    {
        public:
            virtual void test(const char* c) { cout << c << endl; }
    };
     
     
    int main(void)
    {
        c2 t;
        std::string toto("toto");
        t.func();
        t.test(toto);
        return 0;
    }
    voilà ce que dit g++ :

    main.cpp: In function 'int main()':
    main.cpp:30: erreur: no matching function for call to 'c2::test(std::string&)'
    main.cpp:21: note: candidats sont: virtual void c2::test(const char*)
    Merci d'avance
    http://beuss.developpez.com
    Tutoriels PostgreSQL, Assembleur, Eclipse, Java

  2. #2
    Expert confirmé
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 4 062
    Points
    4 062
    Par défaut
    C'est normal il appelle la fonction "test" de "c2" qui prend en paramètre un "char*" et pas un paramètre "string".
    Tu veux appeler "test" de la classe "c1"?
    Formateur expert .Net/C#/WPF/EF Certifié MCP disponible sur Paris, province et pays limitrophes (enseignement en français uniquement).
    Mon blog : pragmateek.com

  3. #3
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    Les fonctions de c1 sont cachées par la fonction de c2 car elles ont le même nom. Il te faut la déclarer explicitement.

  4. #4
    Expert confirmé
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 4 062
    Points
    4 062
    Par défaut
    Citation Envoyé par Miles
    Les fonctions de c1 sont cachées par la fonction de c2 car elles ont le même nom. Il te faut la déclarer explicitement.
    On ne peut pas bricoler autrement avec l'opérateur de résolution de portée par exemple?
    Formateur expert .Net/C#/WPF/EF Certifié MCP disponible sur Paris, province et pays limitrophes (enseignement en français uniquement).
    Mon blog : pragmateek.com

  5. #5
    Expert éminent
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Points : 8 339
    Points
    8 339
    Par défaut
    on peut toujours bricoler...
    essaie Mais c'est tout sauf clean...
    Rédacteur "éclectique" (XML, Cours PHP, Cours JavaScript, IRC, Web...)
    Les Règles du Forum - Mon Site Web sur DVP.com (Développement Web, PHP, (X)HTML/CSS, SQL, XML, IRC)
    je ne répondrai à aucune question technique via MP, MSN ou Skype : les Forums sont là pour ça !!! Merci de me demander avant de m'ajouter à vos contacts sinon je bloque !
    pensez à la balise [ code ] (bouton #) et au tag (en bas)

  6. #6
    Expert confirmé
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 4 062
    Points
    4 062
    Par défaut
    Citation Envoyé par Swoög
    Mais c'est tout sauf clean...
    Ca évite quand même de redéfinir la fonction.
    Formateur expert .Net/C#/WPF/EF Certifié MCP disponible sur Paris, province et pays limitrophes (enseignement en français uniquement).
    Mon blog : pragmateek.com

  7. #7
    Membre éprouvé

    Homme Profil pro
    Inscrit en
    Mars 2003
    Messages
    291
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 291
    Points : 1 059
    Points
    1 059
    Par défaut
    OK merci de ces précisions, donc quand on redéfinit une méthode d'une classe mère il faut redéfinir toutes celles qui ont le même nom ? C'est pas très pratique quand même...
    http://beuss.developpez.com
    Tutoriels PostgreSQL, Assembleur, Eclipse, Java

  8. #8
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    Oui, c'est comme ça

  9. #9
    Membre éprouvé

    Homme Profil pro
    Inscrit en
    Mars 2003
    Messages
    291
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 291
    Points : 1 059
    Points
    1 059
    Par défaut
    Merchi
    http://beuss.developpez.com
    Tutoriels PostgreSQL, Assembleur, Eclipse, Java

  10. #10
    Expert éminent
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Points : 8 339
    Points
    8 339
    Par défaut
    Citation Envoyé par Beuss
    OK merci de ces précisions, donc quand on redéfinit une méthode d'une classe mère il faut redéfinir toutes celles qui ont le même nom ? C'est pas très pratique quand même...
    En théorie, quand tu redéfinies une fonctions dans une classe fille, c'est pour modifier son comportement... donc en toute logique, le comportement devrait être modifier pour toutes les combinaisons de paramètres...

    Il faut voir une méthode membre comme une action que peut réaliser l'objet, les paramètres n'étant qu'un amas de données qui permettent à l'objet d'obtenir les informations nécessaire à son action ... et les différentes surdéfinitions modifient simplement la façon de traiter ces données

    Donc si tu modifies l'action dans la classe file, tu modifies aussi les données nécessaires à l'action, si tu ne respécifie pas la façon d'interpréter tel ou tel ensemble de données, il est normal que l'objet ne puisse effectuer la nouvelle action avec cet amas de données là... et pour plus de cohérence, l'action de la classe mère est masquée par l'action de la classe fille...

    Je ne sais pas si c'est extrêment clair, mais je pense que tu dois comprendre le pourquoi de ce phénomène


    C'est peut-être pas pratique, parce que tu ne l'utilises pas dans la bonne optique
    Rédacteur "éclectique" (XML, Cours PHP, Cours JavaScript, IRC, Web...)
    Les Règles du Forum - Mon Site Web sur DVP.com (Développement Web, PHP, (X)HTML/CSS, SQL, XML, IRC)
    je ne répondrai à aucune question technique via MP, MSN ou Skype : les Forums sont là pour ça !!! Merci de me demander avant de m'ajouter à vos contacts sinon je bloque !
    pensez à la balise [ code ] (bouton #) et au tag (en bas)

  11. #11
    Membre éprouvé

    Homme Profil pro
    Inscrit en
    Mars 2003
    Messages
    291
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 291
    Points : 1 059
    Points
    1 059
    Par défaut
    C'est un point de vue
    Comme tu le vois ici, la surcharge est utilisée pour une raison de compatibilité avant migration totale vers string, cela permet d'avoir l'ancien code et le nouveau qui fonctionnent, il n'y a donc pas de raison de la modifier (ce qui me semble logique puisqu'elle fait appel à une fonction virtuelle pure...)
    http://beuss.developpez.com
    Tutoriels PostgreSQL, Assembleur, Eclipse, Java

  12. #12
    Expert éminent
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Points : 8 339
    Points
    8 339
    Par défaut
    dans ce cas, déclares plutôt la fonction avec le type std::string en paramètre, comme char* est implicitement convertible en std::string, il n'y aura plus aucun problème...
    Rédacteur "éclectique" (XML, Cours PHP, Cours JavaScript, IRC, Web...)
    Les Règles du Forum - Mon Site Web sur DVP.com (Développement Web, PHP, (X)HTML/CSS, SQL, XML, IRC)
    je ne répondrai à aucune question technique via MP, MSN ou Skype : les Forums sont là pour ça !!! Merci de me demander avant de m'ajouter à vos contacts sinon je bloque !
    pensez à la balise [ code ] (bouton #) et au tag (en bas)

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. surcharge de fonction
    Par BigNic dans le forum C++
    Réponses: 2
    Dernier message: 21/03/2006, 18h57
  2. API HOOK, Dump dll, Surcharge de Fonction
    Par MicroAlexx dans le forum Windows
    Réponses: 2
    Dernier message: 30/12/2005, 10h39
  3. [MFC] Surcharger des fonctions de CView
    Par Philippe320 dans le forum MFC
    Réponses: 2
    Dernier message: 22/11/2005, 21h24
  4. singleton, polymorphisme, et surcharge de fonction
    Par legend666 dans le forum C++
    Réponses: 11
    Dernier message: 14/11/2005, 09h27
  5. Surcharge de fonction d'un edit dynamique
    Par Tartar Ukid dans le forum C++Builder
    Réponses: 4
    Dernier message: 13/10/2003, 11h56

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo