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 :

dangers de l'héritage multiple


Sujet :

C++

  1. #1
    Membre éclairé Avatar de ZaaN
    Inscrit en
    Novembre 2005
    Messages
    819
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 819
    Par défaut dangers de l'héritage multiple
    salut,

    je me rappel vraiment plus , mais on m'avait mis en garde contre certains dangers de l'héritage multiple en c++.

    Qui peut m 'en dire plus merci bcp d'avance.

    Pour ma part, il me semble qu'a part des fonctions ou membres portant le meme nom, on ne devrait pas rencontrer de difficultées...

    les pros, vous en dites quoi ?

  2. #2
    Membre averti
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Août 2007
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Août 2007
    Messages : 52
    Par défaut
    Le vrais danger c'est l'héritage en diamant

    class A
    {
    int val;
    }
    class B : public A
    {
    initialise, dans le constructeur val à 5
    }
    class C : public A
    {
    initialise, dans le constructeur val à 8
    }

    class D : public B, public C
    {
    QUE VAUX VAL???
    }

  3. #3
    Membre éclairé Avatar de ZaaN
    Inscrit en
    Novembre 2005
    Messages
    819
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 819
    Par défaut
    Citation Envoyé par Mizar75
    QUE VAUX VAL???
    ben bonne question alors.

  4. #4
    Membre averti
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Août 2007
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Août 2007
    Messages : 52
    Par défaut
    Idem pour une methode virtuel défini dans A et implementé dans B et C.

    Si on l'appel depuis D quel code va s'executer?

  5. #5
    Alp
    Alp est déconnecté
    Expert confirmé

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Par défaut
    Ceci est solutionné par l'héritage virtuel

  6. #6
    Membre averti
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Août 2007
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Août 2007
    Messages : 52
    Par défaut
    Citation Envoyé par Alp
    Ceci est solutionné par l'héritage virtuel
    C'est quoi?

  7. #7
    Membre confirmé
    Inscrit en
    Avril 2007
    Messages
    187
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 187
    Par défaut
    ceci n'est pa solutionné par la virtualité,ca ne va meme pas passer à la compilation,sinn pr remedier au probleme,il suffit d'utiliser l'operateur

  8. #8
    Membre Expert Avatar de KiLVaiDeN
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    2 885
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 2 885
    Par défaut
    Salut,

    Selon moi, la possibilité de faire de l'héritage multiple est une bonne chose.

    Je suis un peu triste que des langages comme Java ou C# ne permettent pas de faire de l'héritage multiple, car au final les problèmes qui y sont liés ne sont rien de plus que des erreurs de modélisation. A mon avis, le fait que des langages comme Java ou C# ont fait l'impasse dessus, réside dans la complexité de compilation liée à cette fonctionnalité qui aurait impliqué une certaine lenteur -> pour un langage semi-compilé, c'est gênant.

    L'héritage multiple est cependant une fonctionnalité importante et utile lorsqu'on fait une application complexe. En C++ par exemple, quand on prend soin de faire un bon design, l'héritage multiple n'est jamais problématique.

    Je me suis fait à la programmation par interfaces, mais il y a des situations où on sent bien que l'héritage multiple aurait été la solution la plus élégante et intuitive.. Et il est dommage de devoir utiliser des ruses pour imiter quelque chose d'aussi simple dans le concept

    A+

  9. #9
    Membre éclairé Avatar de Ekinoks
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2003
    Messages
    687
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2003
    Messages : 687
    Par défaut
    Le mot "dangers" est un peu fort je trouve, car il me semble que tout les compilateurs arrivent à déceler ces problèmes lors de la compilation...
    Cependant, il est vrais que SUN ou même les bouquins / doc JAVA, il n'hésite pas à utiliser ce mot pour essayer de vendre leur fausse solution d'interface :’(

  10. #10
    Membre averti
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Août 2007
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Août 2007
    Messages : 52
    Par défaut
    Citation Envoyé par bouzaidi
    ceci n'est pa solutionné par la virtualité,ca ne va meme pas passer à la compilation,sinn pr remedier au probleme,il suffit d'utiliser l'operateur
    Non je pense pas non plus. En fait tous ce joue au niveau du compilateur qui à ses propres régles. Certain accepte de compiller d'autre non.
    L'idéal est de ne pas faire.

    Sinon moi aussi je suis pour l'héritage multiple, bien pratique pour un bon découpage en classes.

  11. #11
    Alp
    Alp est déconnecté
    Expert confirmé

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Par défaut
    Citation Envoyé par bouzaidi
    ceci n'est pa solutionné par la virtualité,ca ne va meme pas passer à la compilation,sinn pr remedier au probleme,il suffit d'utiliser l'operateur
    L'organigramme en diamant ne fonctionnera (ne compilera, même, sur un compilo digne de ce nom) que si l'on utilise l'héritage virtuel ( class B : virtual public A, ... ).

  12. #12
    Membre Expert
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Par défaut
    Salut à tous,

    Juste pour info, il me semble que l'on utilise "héritage répété" pour un héritage en diamant...
    Les dangers restent la mauvaise conception, comme toujours !
    Pour les conflits de noms, je ne sais pas comment ça se gère en C++ ( à part les namespace introduit préalablement)

    A+

  13. #13
    Membre éclairé Avatar de befalimpertinent
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    561
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Avril 2007
    Messages : 561
    Par défaut
    Poukill a raison : le danger est plus lié à un problème de conception qu'au mécanisme de l'héritage multiple.

    Bien souvent quand on se retrouve à vouloir faire de nombreux héritages multiples c'est qu'on à mal posé le problème. On s'appuie trop sur l'héritage pour éviter de redéfinir des fonctions et pas assez sur la composition.

    Sur le même sujet :

    Par exemple si on fait une classe abstraite Personne. Et deux classes filles qui en héritent : Etudiant et Chercheur.

    Que faire si on souhaite créer un étudiant-chercheur ?
    Probablement pas un diamant...

    PS : je ne sais plus ou j'ai aperçu cet exemple, désolé pour la mauvaise citation au cas où

  14. #14
    Alp
    Alp est déconnecté
    Expert confirmé

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Par défaut
    C'est très pertinent.

    La solution technique à l'héritage en diamant est l'héritage virtuel.
    Ce n'est pas pour ça que c'est la meilleure solution.

    L'héritage lui-même, simple, est trop souvent utilisé. On peut souvent remplacer l'héritage par la composition en obtenant un petit gain de performance, mais un énorme gain en flexibilité, souplesse du code.
    L'héritage public est la relation la plus forte qui soit. La composition, elle, est une relation assez faible.

    koala01 (désolé si je me trompe) en a parlé récemment dans un topic.

  15. #15
    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
    Citation Envoyé par KiLVaiDeN
    Je me suis fait à la programmation par interfaces
    Et bien pas moi... Exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    interface I
    { 
      void f();
      void g();
    };
     
    class A : I, autreClassA
    {
    };
     
    class B : I, autreClassB
    {
    };
    Avec autreClassA et autreClassB des classes que je ne peux pas modifier (bibliothèque externe).

    Je sais que f() peut s'implémenter en fonction de g(), toujours. Et bien, pas moyen d'écrire ça avec des interfaces. Le mieux que j'ai trouvé (et qui n'est pas top), c'est d'ajouter une autre classe :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    class IImplementation
    {
      static void f(I objet);
    };
     
    void A::f()
    {
      IImplementation::f(this);
    }
     
    void B::f()
    {
      IImplementation::f(this);
    }
    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.

  16. #16
    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,

    De manière générale, il est déjà utile de rappeler qu'il s'agit d'utiliser l'héritage avec pragmatisme.

    Est il utile de rappeler l'un des principes de base énoncé dans la plupart des bouquins sérieux parlant de l'héritage:
    préférez la composition à l'héritage
    Est il aussi utile de rappeler que, bien souvent, les problèmes que l'on peut avoir à gérer s'adaptent très bien à l'un des 23 design patterns identifiés par le Gang Of Four, ou à un "mix" de plusieurs d'entre eux

    Encore faut il être en mesure de reconnaître que l'on est dans une situation dans laquelle tel ou tel design patterns est utilisable... mais c'est un autre débat.

    Ceci dit, je ne peux m'empêcher de penser que si "danger" il y a dans un héritage multiple, c'est surtout du fait que les phénomènes qu'il implique par "effet de bord" sont généralement mal compris, et résident dans la plupart des cas en d'éventuels conflits de nom de variable ou de fonction.

    Le cas "peau de banane" étant bien sur l'héritage en losange ou en diamant

    Le plus souvent, celui qui parlera de danger sera surtout celui qui n'a jamais pris la peine de réfléchir sereinement et complètement aux différentes implications

    Mais, encore une fois, aucun des écueils qui pourraient apparaître du fait d'un héritage multiple (qu'il soit en losange ou non) n'est réellement insurmontable, pour autant que l'on soit conscient de son apparition...

    Pour conclure, j'aurais envie de rappeler que, tant dans la vie de tous les jours qu'en programmation, rien n'est jamais sans danger si c'est fait de manière inconsidérée... Par contre, rien n'est dangereux si c'est fait à bon escient et en pleine connaissance des tenants et aboutissants
    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

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

Discussions similaires

  1. composants C++ Builder et héritage multiple
    Par vedrfolnir dans le forum C++Builder
    Réponses: 2
    Dernier message: 12/10/2005, 10h04
  2. [heritage][conception]héritage multiple en java!
    Par soulhouf dans le forum Langage
    Réponses: 9
    Dernier message: 25/08/2005, 20h03
  3. L'héritage multiple est-il possible en Delphi ?
    Par SchpatziBreizh dans le forum Langage
    Réponses: 8
    Dernier message: 30/06/2005, 11h30
  4. utilisez vous l'héritage multiple ?
    Par vodosiossbaas dans le forum C++
    Réponses: 8
    Dernier message: 13/06/2005, 20h25
  5. [XML Schemas]héritage multiple
    Par nicolas_jf dans le forum XML/XSL et SOAP
    Réponses: 2
    Dernier message: 10/06/2003, 12h55

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