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

Langage C++ Discussion :

accéder à classe dérivée via une classe de base


Sujet :

Langage C++

  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2011
    Messages
    74
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 74
    Points : 389
    Points
    389
    Par défaut accéder à classe dérivée via une classe de base
    Bonjour

    ma question porte sur le polymorphisme et la résolution dynamique des types (ou du moins je crois ^^).

    Imaginons que j'ai une classe Base et une classe Derivee qui hérite de Base.
    J'ai une autre classe qu'on appellera C, qui a un attribut de type Base* . C a un constructeur du genre C(Base* b)
    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
     
    class Base
    {
    	//atributs de Base
    }
     
    class Derivee : public Base
    {
    	//atributs propre à Base
    }
     
    class C
    {
    	Base* baseOuDerivee;
     
    	C(Base* b) {baseOuDerivee = b;}
    }
    Evidemment en construisant un objet C, je voudrais pouvoir lui donner une Base ou une Derivee (d'où le nom à 2 balles de l'attribut de C...).

    Je peux construire des objets C en passant une Derivee au constructeur, mais impossible d'accéder aux attributs propres à Derivee. Les Derivee sont
    castées en Base implicitement.
    J'aimerais savoir comment résoudre ce problème (s'il est résolvable, of course)

    Merci

  2. #2
    Membre expérimenté
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2011
    Messages
    576
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 576
    Points : 1 528
    Points
    1 528
    Par défaut
    Salut,

    C'est possible (en trifouillant avec des dynamic_cast, google est ton amis), mais c'est mal et dans ce cas il y a clairement un problème de design.

    Si C prend un Base*, il a doit avoir uniquement besoin des services (attribut/méthodes si tu préfères) fournis par Base.

    Si à un moment donné il doit pourvoir accéder à des services fournis par Derivee, soit il doit prendre un Derivee, soit il peut être intéressant de remonter ces services dans Base, soit rajouter une classe entre Base et Derivee qui fournirait ces services.
    La perfection est atteinte, non pas lorsqu’il n’y a plus rien à ajouter, mais lorsqu’il n’y a plus rien à retirer. - Antoine de Saint-Exupéry

  3. #3
    Membre éprouvé Avatar de Steph_ng8
    Homme Profil pro
    Doctorant en Informatique
    Inscrit en
    Septembre 2010
    Messages
    677
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Doctorant en Informatique

    Informations forums :
    Inscription : Septembre 2010
    Messages : 677
    Points : 997
    Points
    997
    Par défaut
    +1

    J'ajouterais que, si tu ne peux/veux pas modifier ta conception, tu peux définir des fonctions membres virtuelles, qui retournent une valeur neutre ou lancent une exception dans le cadre de Base, et font ce que tu souhaites dans le cas de Derivee.

    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
    class Base
    {
     
        (...)
     
      public:
        virtual
        TypeDeRetour uneFonction(...)
        { return TypeDeRetour(); }
     
        virtual
        TypeDeRetour2 uneAutreFonction(...)
        { throw std::runtime_error("Opération non définie"); }
     
    }; // class Base
     
     
    class Derivee : public Base
    {
     
        (...)
     
      public:
        virtual
        TypeDeRetour uneFonction(...) // Les mêmes paramètres que précédemment
        {
            (...)
        }
     
        virtual
        TypeDeRetour2 uneAutreFonction(...) // Les mêmes paramètres que précédemment
        {
            (...)
        }
     
    }; // class Derivee

    Mais cela implique que la classe de base connaisse tous les services proposés par la classe dérivée.
    Et au final, ça revient à ce que pyros disait :
    Citation Envoyé par pyros Voir le message
    Si C prend un Base*, il a doit avoir uniquement besoin des services (attribut/méthodes si tu préfères) fournis par Base.

  4. #4
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2011
    Messages
    74
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 74
    Points : 389
    Points
    389
    Par défaut
    merci pour les réponses.

    je vais modifier la conception de la chose. En fait j'ai une structure de graphes routiers que je dois "rendre graphique" via Qt (dans le cadre d'un stage). Dans la structure j'ai plusieurs types de sommets, et je voulais essayer de limiter au maximum les équivalents graphiques. D'où l'intérêt d'accéder aux différents types de sommets via la classe de base. mais comme mon interface doit permettre de modifier des attributs de ces sommets, en fonction du type de sommet affiché je dois avoir accès à différents attributs (cette phrase est très moche).

    si je peux me permettre une autre question : qu'est ce qui est moche avec les dynamic_cast ? j'ai bien l'intuition que ça risque d'amener des comportements douteux, mais formellement quel est le problème ? (j'ai conscience que cette question peut amener une réponse longue et fastidieuse )

  5. #5
    Membre éprouvé Avatar de Steph_ng8
    Homme Profil pro
    Doctorant en Informatique
    Inscrit en
    Septembre 2010
    Messages
    677
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Doctorant en Informatique

    Informations forums :
    Inscription : Septembre 2010
    Messages : 677
    Points : 997
    Points
    997

  6. #6
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2011
    Messages
    74
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 74
    Points : 389
    Points
    389
    Par défaut
    ah bah oui la FAQ... y'en a qui en songe pas long (je parle de moi)
    merci steph, ça répond à ma question

  7. #7
    Membre éprouvé Avatar de Steph_ng8
    Homme Profil pro
    Doctorant en Informatique
    Inscrit en
    Septembre 2010
    Messages
    677
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Doctorant en Informatique

    Informations forums :
    Inscription : Septembre 2010
    Messages : 677
    Points : 997
    Points
    997
    Par défaut
    Pas de quoi !

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

Discussions similaires

  1. Réponses: 15
    Dernier message: 01/03/2015, 13h16
  2. Réponses: 7
    Dernier message: 05/04/2011, 17h19
  3. Réponses: 4
    Dernier message: 06/04/2008, 18h34
  4. Réponses: 2
    Dernier message: 02/02/2008, 07h37
  5. Réponses: 7
    Dernier message: 29/11/2007, 16h03

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