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 :

Priorité dans un héritage multiple de classes ayant un parent commun


Sujet :

Langage C++

  1. #1
    Membre actif Avatar de ttone
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    589
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2008
    Messages : 589
    Points : 203
    Points
    203
    Par défaut Priorité dans un héritage multiple de classes ayant un parent commun
    Bonjour à tous,

    Je suis dans une réarchitecture d'un projet, et cette fois je ne me laisserai pas impressionner par la tête que me fait GDB :

    J'ai un ensemble d'objets dans un VST (logiciels audio) : 3 instruments (violons, guitare électrique, clarinettes) qui héritent d'instruments.

    Instrument.class
    héritant de "SourceSonore.class".
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SourceSonore.class
    V
    Instrument.class
    >violon.class
    >guitareElectrique.class
    >horn.class

    Seulement voilà, guitareElectrique.class hérite de "Amplification.class" qui dérive aussi de "SourceSonore.class".


    Résultat : quand j'appelle SourceSonore::play() via :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    guitareElectrique::play()
    GDB ne sait pas s'il doit considérer Instrument::play() ou Amplification::play()...


    Comment faire ?
    Puis je lui assigner une priorité de l'un sur l'autre ?

    Car j'ai revu une fois mon code en faisant un héritage comme ceci :
    violon > SourceSonore
    horn > SourceSonore
    guitareElectrique > Amplification

    Mais la classe Instruments m'est très utile ailleurs...

    Merci

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

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Salut,

    Pose toi peut être la question de savoir si une guitare électrique peut décemment être considérée comme une source amplifiée, ou s'il s'agit, tout simplement d'une source sonore, qui dispose d'une composante d'amplification...

    Peut-être l'héritage multiple n'est il pas la solution qui t'intéresse

    N'oublie pas le fameux principe de substitution de liskov: pour pouvoir faire hériter une classe d'une autre, il faut que toutes les propriétés de la classe parent soient applicables à la classe dérivée.

    Si tu pars sur l'idée d'un héritage multiple dans lequel ta guitare électrique serait le mariage d'un amplificateur et d'un instrument (ou d'une source sonore), j'ai réellement un doute quant au respect de ce principe:

    Tu ne peux effectivement pas estimer qu'une guitare électrique dispose de toutes les caractéristiques d'un amplificateur

    Tu peux, certes, modifier certaines valeurs que l'on retrouve habituellement sur l'amplificateur, mais un amplificateur qui ne permettrait de modifier que les valeurs que l'on peut modifier sur une guitare électrique serait sans doute de bien piètre qualité

    Enfin, lorsque tu envisages un héritage multiple basé sur deux (ou plusieurs) classes qui héritent elle-même d'une même classe commune, il faut penser à l'héritage virtuel, pour, justement, éviter que la composante "ancêtre" ne soit considérée comme intervenant deux fois dans le comportement de l'objet dérivé

    [EDIT]Mais il faut être attentif au fait que l'héritage virtuel pose une série de restrictions, entre autres, concernant les possibilités de transtypage (de cast )
    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
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Salut,
    Uses and Abuses of Inheritance, Part 2, section "How to Separate Siamese Twins" :
    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
    41
     
    class BaseA {
    public:
      virtual int ReadBuf( const char* );
      /* ... */
    };
    class BaseB {
    public:
      virtual int ReadBuf( const char* );
      /* ... */
    };
     
    class BaseA2 : public BaseA {
    public:
      virtual int BaseAReadBuf( const char* p ) = 0;
    private:
      int ReadBuf( const char* p ) { // override inherited
        return BaseAReadBuf( p );    // to call new func
      }
    };
     
    class BaseB2 : public BaseB {
    public:
      virtual int BaseBReadBuf( const char* p ) = 0;
    private:
      int ReadBuf( const char* p ) { // override inherited
        return BaseBReadBuf( p );    // to call new func
      }
    };
     
    class Derived : public BaseA2, public BaseB2 {
      /* ... */
     
      int BaseAReadBuf( const char* );
          // overrides BaseA::ReadBuf indirectly
          // via BaseA2::BaseAReadBuf
     
      int BaseBReadBuf( const char* );
          // overrides BaseB::ReadBuf indirectly
          // via BaseB2::BaseBReadBuf
    };

  4. #4
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Franchement, l'amplificateur, je le vois mieux en décorateur qu'en ancètre...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #5
    Expert éminent

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Points : 7 618
    Points
    7 618
    Billets dans le blog
    3
    Par défaut
    D'autant que l'amplification n'a rien à voir avec la guitare
    L'instrument c'est une guitare, l'amplification est juste un "traitement" du son. Tout comme on peut avoir un violon electrique, un piano electrique (et pas un synthé ! ), ....
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

  6. #6
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Franchement, l'amplificateur, je le vois mieux en décorateur qu'en ancètre...
    Pas faux.
    @ttone : tu as une présentation du pattern décorateur dans le tutoriel "Présentation des principaux design patterns en C++" de Davidbrcz.

  7. #7
    Membre actif Avatar de ttone
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    589
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2008
    Messages : 589
    Points : 203
    Points
    203
    Par défaut
    Merci pour vos posts. Finalement je me suis mis au boulot, et respecté le minimum vital Liskov...

Discussions similaires

  1. Réponses: 6
    Dernier message: 22/07/2010, 15h17
  2. Système de classe, avec héritage multiple dynamique
    Par kimjoa dans le forum Contribuez
    Réponses: 0
    Dernier message: 09/01/2010, 18h07
  3. Ambiguité dans l'héritage de classes
    Par kremvax dans le forum Langage
    Réponses: 12
    Dernier message: 26/05/2009, 15h01
  4. héritage d'une classe pas dans le meme package
    Par marry dans le forum Général Java
    Réponses: 14
    Dernier message: 07/05/2009, 18h14
  5. Comment hériter de deux classes ? (que signifie héritage multiple ?)
    Par adil_vpb dans le forum Débuter avec Java
    Réponses: 3
    Dernier message: 23/10/2007, 19h27

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