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 & diamant de la mort


Sujet :

C++

  1. #1
    Membre émérite
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 764
    Points : 2 705
    Points
    2 705
    Par défaut Héritage multiple & diamant de la mort
    Hello,

    J'aurais besoin de faire un héritage multiple, sachant que ma seconde classe intermédiaire (qui m'amène au diamant) ne contiendra que des fonctions (pas de membres !).

    Je ne peux utiliser des fonctions dans un espace de nommage, car ces fonctions ont besoin de données membres protégées (définies plus haut dans la hiérarchie). Ou alors, je dois rendre ces fonctions amies.
    Mais cela me gêne, car conceptuellement, ces fonctions concernent des classes fille.

    J'ai l'impression que je devrais faire un héritage multiple, privé en ce qui concerne la classe qui ne contient que les fonctions. Mais je ne suis pas très à l'aise avec ces notions.

    Qu'en pensez-vous ?

  2. #2
    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,
    Bénéficier de l'implémentation -> héritage privé.
    Héritage publique => LSP, çad pouvoir subsituer une instance de la classe dérivée dans une expression contenant un objet de la classe de base et l'expression reste valide (syntaxiquement et sémantiquement bien sûr).
    Cf Quand dois-je faire un héritage public ? protégé ? privé ?
    Ensuite, la portée de l'héritage (public/privée) est une chose distincte (quoique souvent liée par la conception) de l'héritage virtuel. En gros tu peux hériter virtuellement en public ou en privé. C'est la conception qui va te dire quel type d'héritage et si besoin du diamant ou pas.

  3. #3
    Modérateur
    Avatar de bruno_pages
    Homme Profil pro
    ingénieur informaticien à la retraite
    Inscrit en
    Juin 2005
    Messages
    3 533
    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 533
    Points : 6 709
    Points
    6 709
    Par défaut
    Bonjour,

    qu'elle est exactement votre question ?

    en tout cas C++ prévoit les héritages en diamant, pour le faire 'proprement' et éviter les redondances il faut faire des héritages virtual, exemple :
    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
    class C0 {
      ....
    };
    
    class C1a : public virtual C0 {
      ....
    };
    
    class C1b : public virtual C0 {
      ....
    };
    
    class C2 : public virtual C1a, public virtual C1b {
      ....
    };
    Bruno Pagès, auteur de Bouml (freeware), mes tutoriels sur DVP (vieux, non à jour )

    N'oubliez pas de consulter les FAQ UML et les cours et tutoriels UML

  4. #4
    Membre émérite
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 764
    Points : 2 705
    Points
    2 705
    Par défaut
    Je me demandais si je pouvais me passer de la qualification "virtual" (qui a un coût), dans la mesure où une de mes classes intermédiaires n'a pas de membres.

    Il est vrai toutefois que les membres de la pointe supérieure du diamant seront héritées par les deux chemins, mais comme les exemples expliquant l'héritage multiple ne parlent à chaque fois que de conflits entre les membres de classes intermédiaires (comme dans la FAQ), je ne sais si je dois utiliser "virtual" dans mon cas.

    Par ailleurs, ma classe intermédiaire qui n'est constituée que de fonctions n'ayant pas vocation à être instanciée, que se passerait-il si je la faisais dériver de manière protégée de la classe parente ?

  5. #5
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Le virtual dans l'heritage est la pour empecher qu'heriter d'une classe par deux chemins ne duplique cette base.

    Qu'est-ce que t'apporte ta seconde classe intermediaire? En particulier est-ce que tu t'attends a manipuler des pointeurs vers cette classe?

    Si la reponse est non, j'envisagerais d'en faire un template de classe utilisant le CRTP.
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  6. #6
    Membre émérite
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 764
    Points : 2 705
    Points
    2 705
    Par défaut
    Pas de manipulation de pointeur.

    Disons qu'à la base, j'ai :

    Il y a une fonction polymorphique qui est définie à chaque niveau de hiérarchie, et qui appelle son alter ego dans sa classe parente (il y a une spécialisation en cascade de cette fonction). Normalement, toutes les classes au niveau de D dérivent de A/B/C.

    J'ai à présent besoin d'une classe E, dont la fonction polymorphique va appeler son alter ego dans C, mais dans le cas de E, je ne veux pas appeler la fonction de B, et passer directement à celle de A.

    J'envisageais donc de faire, C héritant de manière privée dans le 1er cas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
      A           A
     / \          |
    B  C   et     C
     \ /          |
      D           E
    En effet, la notion d'héritage concernant C est en fait plutôt orthogonale avec celle liant A, B, et D.

    C doit hériter de A, car elle utilise une fonction de A qui utilise un membre protégé de A. Cette fonction retournant une chaîne liée à l'objet, peut-être devrais-je relâcher l'encapsulation, et faire une fonction équivalente qui prend en paramètre l'objet, et appelle la fonction membre...

  7. #7
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Les changements que tu fais ont d'autres implications que celle que tu dis desirer.

    Comme tu n'en dis pas assez pour savoir si elle est valable ou non, ma suggestion etait d'avoir un template de classes C<T> avec D heritant de C<B> et E heritant de C<A>.
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  8. #8
    Membre émérite
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 764
    Points : 2 705
    Points
    2 705
    Par défaut
    Je ne comprend pas trop, mais parce que je ne connaissais pas le CRTP.

    Je pense que je devrais assimiler ce que je viens de lire à ce sujet avant de mettre ça tout de suite dans du code de prod.

    Je crois que je vais me rabattre sur le relâchement de l'encapsulation.

    Merci.

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