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 :

héritage multiple et C++


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Avatar de wafiwafi
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    500
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 500
    Points : 328
    Points
    328
    Par défaut héritage multiple et C++
    Bonjour,
    Pour les habitués de programmation en C++, voila une affirmation pour laquelle j'aimerais avoir vos critiques:

    On sait que l'héritage multiple est autorisé en C++. Il y a donc un risque important de "losange de la mort".
    Voila mon affirmation :
    Il est conseillé aux programmeur de faire appel aux classes abstraites sans implémentation (classes virtuelles purs) en cas d'héritage multiple en C++. Les priver des champs (sauf pour les constantes) permet de minimiser davantage les risques de conflit.

    C'est l'équivalent d'interface en JAVA.

  2. #2
    Membre chevronné
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Points : 2 205
    Points
    2 205
    Par défaut
    Et c'est pour ça qu'on a créer l'héritage virtuel ...

  3. #3
    Membre averti
    Avatar de wafiwafi
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    500
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 500
    Points : 328
    Points
    328
    Par défaut
    J'en conclus que ma citation est correct?
    Merci

  4. #4
    Membre chevronné
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Points : 2 205
    Points
    2 205
    Par défaut
    J'ai jamais dis ça. J'ai dis que le langage nous fourni un moyen de répondre à la problématique que tu poses (héritage en losange) par le biais de l'héritage virtuel.

  5. #5
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 279
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 279
    Points : 11 015
    Points
    11 015
    Par défaut
    Commençons par comprendre le LSP, et l'héritage multiple passera mieux...

    De plus, Les classes abstraites pures ne sont pas toujours la panacée, cf le pattern NVI et son application directe à la programmation par contrat.

    PS: "classe virtuelle" n'existe pas. Une classe de base peut être virtuelle relativement à un héritage. Une classe peut ne disposer que de fonction membre virtuelles pures (et c'est autre chose).

  6. #6
    Membre averti
    Avatar de wafiwafi
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    500
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 500
    Points : 328
    Points
    328
    Par défaut
    Merci pour ces réponses.
    Visiblement le C++ ne s'est pas contenté d'un équivalent d' utilisation d'interface de JAVA pour résoudre le problème du losange. Je vais me pencher dans l'application de l'héritage virtuel et surtout comment il est bâti.
    En tout cas merci de m'avoir remis au bon chemin.

  7. #7
    Membre chevronné
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Points : 2 205
    Points
    2 205
    Par défaut
    et surtout comment il est bâti.
    Hu? C'est un détail d'implémentation du langage ça ...

    ah voilà je le trouvais plus, y'a un item dans la faq :
    http://cpp.developpez.com/faq/cpp/?p...RITAGE_virtuel

  8. #8
    Modérateur
    Avatar de bruno_pages
    Homme Profil pro
    ingénieur informaticien à la retraite
    Inscrit en
    Juin 2005
    Messages
    3 534
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : ingénieur informaticien à la retraite
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juin 2005
    Messages : 3 534
    Points : 6 723
    Points
    6 723
    Par défaut
    Citation Envoyé par wafiwafi Voir le message
    C++ ne s'est pas contenté d'un équivalent d' utilisation d'interface de JAVA.
    non, heureusement !

    oh, il y a de beaux diagrammes UML dans la FAQ

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

    Informations professionnelles :
    Activité : aucun

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

    Peut être serait il bon d'insister une fois de plus sur ce qu'a mis luc en avant, à savoir
    Citation Envoyé par Luc Hermitte Voir le message
    Commençons par comprendre le LSP, et l'héritage multiple passera mieux...
    <snip>
    L'un des grands reproches que l'on puisse faire à java (par exemple), c'est de considérer que tout hérite implicitement d'un "super objet".

    Quand on y regarde de plus près, le super objet (ou similaire) est le principal problème qui risque de provoquer le fameux losange de la mort et représente quelque part une très grosse infraction à LSP (Liskov Substitution Principle).

    En effet, LSP met en évidence l'importance qu'il y a à assurer la substituabilité d'un objet du type de base avec un objet du type dérivé lors de l'héritage: Lorsque tu envisage l'héritage public, tu dois pouvoir faire cohabiter n'importe quel objet dont le type se trouve dans la hiérarchie de classes que tu crée, y compris, les types qui dérivent des types qui dérivent (et ainsi de suite) de ton type de base.

    Lorsque tu décide de te baser sur un super objet, ou, du moins, sur un type de base trop générique, tu en arrive, selon Liskov, à admettre de faire cohabiter des voitures, des clients et des chiens (ou des poux) dans une seule et même collection d'objets.

    Or, il semble évident qu'il te sera impossible de trouve le moindre service commun qui soit rendu par ces différents types .

    A l'inverse, si tu n'envisage effectivement l'héritage public que pour les types pour lesquels la substituabilité est établie (un turbo compresseur héritant d'une turbine et d'un compresseur, ces deux derniers n'ayant aucun héritage commun, parce que ne rendant aucun service similaire ), le risque de te retrouver face à un losange de la mort s'amenuise énormément

    De plus, C++ fournit un autre paradigme des plus intéressants, qui te permet de contourner les risques résiduels: le paradigme générique.

    L'idée est simple, mais, pour la développer, je vais schématiser (au moins sommairement) les trois paradigmes en présence:

    Le premier paradigme qui a été mis en oeuvre (par C, par exemple) était le paradigme procédural: on s'inquiète, en priorité, au données que l'on doit traiter.

    Avec la complexification des applications, un deuxième paradigme a été envisagé: le paradigme Orienté Objet.

    On ne s'intéresse plus aux données en tant que telles, mais bien au services que l'on attend d'elles (en plus d'assurer la substituabilité, s'il échoit).

    Le paradigme générique, enfin, s'intéresse moins au service que l'on attend des données à gérer qu'à... la manière dont les données sont gérées.

    On remarque en effet que la manière dont une liste d'objet sera gérée sera identique que nous gérions une liste de petites cuillers, une liste de personnes, une liste de voitures, ou la liste des animaux d'un zoo.

    En C++, le paradigme générique est mis en oeuvre grâce aux classes et aux fonction template.

    Et, chose assez sympa, si on a une classe template MaClass, les spécialisations MaClass<int> et MaClass<UnTypeQuelconque> représentent, de fait, deux types tout à fait distincts, et permettent donc, lorsqu'elles interviennent dans un héritage, d'avoir une interface strictement identique mais... d'éviter le losange de la mort.

    Au final, j'aurais presque tendance à dire que la crainte du losange de la mort, pour compréhensible qu'elle soit, est beaucoup plus induite par la méconnaissance (pour ne pas dire de l'ignorance délibérée) d'un principe de base que d'un problème réellement inévitable.

    Alors, bien sur, il restera toujours, tout en utilisant l'ensemble des possibilités offertes (respect stricte de LSP et programmation générique) quelques exceptions qui feront que l'on peut malgré tout y être confronté un jour ou l'autre, et qui justifient, à elles seules, d'attirer l'attention sur le risque potentiel qu'il représente...

    Pour ces exceptions, la réponse est simple: quand on est confronté, malgré tout le soin que l'on peut apporter à la situation, à la création d'un losange de la mort, il faut envisager... l'héritage virtuel

  10. #10
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 170
    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 170
    Points : 12 291
    Points
    12 291
    Par défaut
    Or, il semble évident qu'il te sera impossible de trouve le moindre service commun qui soit rendu par ces différents types .
    Et bien moi, si.
    Le fait qu'un objet est égale à un autre, sémantique variable en fonction du type d'objet.
    Le type de l'objet pour utilisation de la réflexion.
    Le fait de pouvoir le cloner, sémantique variable en fonction du type d'objet.
    Le délesté de la mémoire s'il n'est plus utilisé.
    ...

+ 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