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

C++ Discussion :

Problème d' héritage


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Invité
    Invité(e)
    Par défaut Problème d' héritage
    Bonjour,

    Je crois avoir ce qui peut être un problème d'héritage. Je fais un programme de traitement d'images en ligne de commande. J'ai entre autre une classe Inversion qui hérite de la classe Command. J'ai prototypé une méthode run() en virtual dans Command pour que quand on la lance ce soit plutot la méthode redéfinie dans Inversion qui soit appelé. Cependant, à l'éxécution c'est la méthode run() de la classe mère qui est appelé à la place. D'où vient l'erreur ?

    Voici mes deux .h :

    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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
     
    #ifndef COMMAND_H
     
    #define COMMAND_H
     
     
     
    #include <string>
     
    #include <vector>
     
    #include <iostream>
     
     
     
    using namespace std;
     
     
     
    class Command
     
    {
     
        public:
     
            Command();
     
            virtual ~Command();
     
            virtual void run();
     
        protected:
     
        private:
     
    };
     
     
     
    #endif // COMMAND_H
    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
    27
    28
    29
    30
    31
    32
    33
     
    #ifndef INVERSION_H
     
    #define INVERSION_H
     
     
    #include "Command.h"
     
    using namespace std;
     
     
     
    class Inversion : public Command
     
    {
     
        public:
     
            Inversion();
     
            virtual ~Inversion();
     
            void run();
     
        protected:
     
        private:
     
    };
     
     
     
    #endif // INVERSION_H
    et leur .cpp

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    #include "Command.h"
     
     
     
    Command::Command(){}
     
     
     
    Command::~Command(){}
     
    void Command::run(){
    cout<< "classe mere" << endl;
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    #include "Inversion.h"
     
    Inversion::Inversion(){
    	Command();
    }
     
    Inversion::~Inversion(){}
     
    void Inversion::run(){
    	cout<< "classe fille" << endl;
    }
    Merci d'avance !

    EDIT: J'ai essayé de garder que le strict nécéssaire dans le code.
    Dernière modification par Invité ; 07/12/2012 à 19h49. Motif: Simplification

  2. #2
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Salut,

    Tu as tellement bien fait le ménage qu'il nous manque le principal, dit donc

    Tu pourrais nous montrer le code qui fait appel à la fonction run, et, surtout, l'initialisation de la variable au départ de laquelle tu appelles cette fonction

    Mais ceci dit, je te remercie quand meme de penser à nos pauvres yeux fatigués en essayant de nous donner un code minimum compilable, et je salue l'effort
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  3. #3
    Invité
    Invité(e)
    Par défaut
    Merci pour la réponse rapide, je suis un peu pressé par le temps justement!

    Pour ne pas copier coller tout le pavé de code, l'appel de run se fait de cette manière là :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    void Facade::runArg(Command pArg){
    	pArg.run();
    }
    avec le paramètre pArg qui est une des classes filles de la classe Command, dont Inversion par exemple.

  4. #4
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    Tu passes l'objet par copie dans ta fonction, tu es donc bien dans le cas du slicing. 2 conseils :
    - Passe par référence à ta fonction
    - Pour éviter ce genre de gags par la suite, dès que tu as une classe qui sert de classe de base, rend la non copiable. http://cpp.developpez.com/faq/cpp/?p...iables_syntaxe (lis aussi les questions autour de celle-ci).
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  5. #5
    Invité
    Invité(e)
    Par défaut
    Merci énormément, cela marche parfaitement après passage par référence! Ah les pointeurs me hanteront toujours!

  6. #6
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    +1 à Koala.

    De plus, le code suivant me semble très suspect :

    Citation Envoyé par boboh0 Voir le message
    [code]
    #include "Inversion.h"

    Inversion::Inversion(){
    Command();
    }
    Que penses-tu qu'il fasse ?

    Sinon, pour ton problème, généralement :
    - Soit il y a un souci de compréhension des règles sur les fonctions virtuelles dans les constructeurs/destructeurs
    - Soit à un moment ou à un autre, on manipule l'objet directement et non plus par pointeur, et on fait une copie qui provoque du slicing.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

Discussions similaires

  1. [C#] Problème d'héritage, aide svp :(
    Par choas dans le forum Windows Forms
    Réponses: 12
    Dernier message: 06/05/2006, 11h46
  2. problème constructeur + héritage
    Par BOLARD dans le forum C++
    Réponses: 10
    Dernier message: 13/04/2006, 08h11
  3. [AS2] Problème d'héritage
    Par wwave dans le forum ActionScript 1 & ActionScript 2
    Réponses: 2
    Dernier message: 27/01/2006, 09h26
  4. Problème d'héritage ?
    Par Romanops dans le forum WinDev
    Réponses: 2
    Dernier message: 16/11/2005, 17h18
  5. Problème d'héritage d'une méthode protégée
    Par shenron666 dans le forum C++
    Réponses: 9
    Dernier message: 28/04/2005, 23h17

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