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 classe dérivée


Sujet :

C++

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2012
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Décembre 2012
    Messages : 23
    Points : 13
    Points
    13
    Par défaut Problème d'héritage classe dérivée
    Bonjour,

    Je dispose de deux classes Base et Derived dont Derived dérive de Base. Voici la définition simplifiée des deux classes :

    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
     
    class Base
    {
    public:
    Base();
    ~Base();
     
    // Plein de méthodes
     
    void do();
    void do1();
    void do2();
     
    private:
    std::vector<uneStructure*> container;
    };
     
    class Derived : public Base
    {
    public:
    Derived();
    ~Derived();
     
    void preDo();
     
    private:
    std::vector<uneStructure*> container;
    };
    Les méthodes do1 et do2 sont des procédures récursives inclues dans do et dont j'ai besoin dans ma classe dérivée. Cependant, lorsque j'exécute la méthode do depuis la classe dérivée, rien ne se passe. Si je copîe le vecteur container dans un objet Base et que j'exécute do, tout se déroule comme je le souhaite.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Derived* der = new Derived();
    der->preDo();
    der->do(); // Aucun résultat
     
    Base* bas = new Base(der->getContainer());
    bas->do(); // Resultat souhaité
    Pourriez-vous m'aider svp ?

    Merci.

  2. #2
    Membre régulier
    Homme Profil pro
    Cocher moderne
    Inscrit en
    Septembre 2006
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Oman

    Informations professionnelles :
    Activité : Cocher moderne

    Informations forums :
    Inscription : Septembre 2006
    Messages : 50
    Points : 118
    Points
    118
    Par défaut
    Bonjour!

    Le container de la classe derived... Ça ne serait pas le même que celui de la classe de base, par hasard? Auquel cas il ne faut pas le re-déclarer dans la classe derived.

  3. #3
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 116
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 116
    Points : 32 968
    Points
    32 968
    Billets dans le blog
    4
    Par défaut
    Et les virtual dans tout ça ?
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 078
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 078
    Points : 12 131
    Points
    12 131
    Par défaut
    Et les virtual dans tout ça ?
    Perdus dans les méandres du JAVA?

  5. #5
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2012
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Décembre 2012
    Messages : 23
    Points : 13
    Points
    13
    Par défaut
    Merci pour vos réponses, je répond un peu tard car j'ai résolu le problème juste après avoir posté.

    Le container de la classe derived... Ça ne serait pas le même que celui de la classe de base, par hasard?
    Si, je ne sais pas pourquoi j'ai procédé ainsi sachant que 2 jours plus tôt je traitais plusieurs cas avec des héritages sans problèmes. Je dois être un peu fatigué

    Bref un passage en protected de la propriété de la classe mère et une suppression de la propriété de la classe fille a résolu l'erreur.

    Grosso modo, le problème qui s'est posé peut être schématisé de la façon suivante non ?

    Nom : Inheritance.png
Affichages : 169
Taille : 13,0 Ko

    Et les virtual dans tout ça ?
    Je n'en ai pas besoin pour l'instant. Le traitement do() est identique pour Base et Derived. Pas besoin de polymorphisme non plus pour l'instant.

  6. #6
    Membre émérite
    Avatar de white_tentacle
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    1 505
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 1 505
    Points : 2 799
    Points
    2 799
    Par défaut
    Le design est curieux. Notamment, demander à l’utilisateur d’appeler explicitement pre-do avant do est bizarre.

    Je verrai plutôt quelque chose comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    class Base
    {
    virtual void preDo() { /* ne fait rien par défaut */  }
    void do() { preDo(); /*traitement */  }
    };
    Sinon, protected est à utiliser avec des pincettes pour ce qui est des membres (impossibilité de garantir les invariants de classe).

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

Discussions similaires

  1. Problème d'héritage classes et interfaces
    Par touftouf57 dans le forum C#
    Réponses: 3
    Dernier message: 18/04/2011, 14h38
  2. Débutant problème d'héritage (class)
    Par panthere noire dans le forum Débuter
    Réponses: 7
    Dernier message: 08/08/2009, 12h03
  3. Réponses: 1
    Dernier message: 24/01/2007, 16h00
  4. problème d'accès dans une classe dérivée!
    Par chrono23 dans le forum C++
    Réponses: 47
    Dernier message: 10/10/2006, 11h22
  5. [C#] Problème classe dérivée
    Par LE NEINDRE dans le forum Windows Forms
    Réponses: 7
    Dernier message: 17/07/2006, 16h36

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