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 avec C++


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre actif
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Juin 2015
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chercheur en informatique

    Informations forums :
    Inscription : Juin 2015
    Messages : 55
    Par défaut Héritage avec C++
    Bonjour à tous,
    J'ai définit 3 classes qui sont:
    Class Position2D: Classe de base
    Class Position3D: Classe dérivée de la classe Position2D (class Position3D : public Position2D)
    Class Vehicule : Classe dérivée de la classe Position3D (class Vehicule : public Position3D)
    Lorsque j'ai essayé d'accéder aux méthodes de la classe de base (Position2D) avec un objet qui est définit par la classe Vehicule, j'ai pas pu.
    J'ai fait une recherche mais j'étais un peu perdu, est-ce que il y a quelqu'un pourrait m'expliquer les solutions possibles pour palier cette interdiction d'accès ?

    Merci

  2. #2
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    Depuis quand une position 3D est une position 2D.
    Plus grave, pourquoi un véhicule est une position 3D. Un véhicule a une position.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    struct Vehicule {
        position3D position;
    };

  3. #3
    Membre actif
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Juin 2015
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chercheur en informatique

    Informations forums :
    Inscription : Juin 2015
    Messages : 55
    Par défaut
    Bonjour,
    Depuis un bon moment si tu rajoutes la troisième dimension "z" .
    Tu peux apprendre un peu de géométrie dans l'espace, également ci-dessous un exemple:
    https://fr.wikibooks.org/wiki/Progra...sses/Exercices

    Merci

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 153
    Billets dans le blog
    4
    Par défaut
    Cette héritage public n'a pas grand sens non, tout comme faire une classe carré héritée de rectangle n'est pas une bonne chose mais se retrouve trop souvent dans des exercices de débutants pour introduire l'héritage, mais avec un peu de code on en saurait plus sur l'origine du problème.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  5. #5
    Membre actif
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Juin 2015
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chercheur en informatique

    Informations forums :
    Inscription : Juin 2015
    Messages : 55
    Par défaut
    C' était juste un exemple, je parle du principe.
    Est-ce que ce genre d'héritage est faisable ou non peu importe l'exemple.

  6. #6
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 153
    Billets dans le blog
    4
    Par défaut
    Principe ou pas, du code est plus clair que ta prose.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    class Pos2 {
    public:
     int get() { return 3; }
    };
    class Pos3 : public Pos2 {};
    class Toto : public Pos3 {};
     
    Toto tt;
    tt.get();
    Est tout a fait correct syntaxiquement, donc si
    Lorsque j'ai essayé d'accéder aux méthodes de la classe de base (Position2D) avec un objet qui est définit par la classe Vehicule, j'ai pas pu.
    Ton code est faux, et la boule de Crystal n'ayant pas encore été inventée, montrer le code faux est le meilleur moyen d'en avoir une correction et le pourquoi de l'erreur.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  7. #7
    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,
    Citation Envoyé par mok_tun Voir le message
    C' était juste un exemple, je parle du principe.
    Est-ce que ce genre d'héritage est faisable ou non peu importe l'exemple.
    Du point de vue "purement légal" (accepté par le compilateur), nous ne sommes absolument pas limités (ou si peu) dans le nombre de niveaux d'héritage en C++.

    Seulement, l'héritage publique est l'une des deux relations les plus fortes qui puissent exister, quel que soit le langage OO envisagé (l'autre étant l'amitié). Si bien que l'on essayera de ne l'utiliser que si c'est absolument nécessaire, et, en tous les cas, si les règles qui régissent ce genre de relation sont respectées.

    Il existe en effet un principe, le LSP (pour Liskov Subsitution Principle ou, si tu préfères en francais le principe de substitution de Liskov) qui doit impérativement être respecté avant que tu ne décide de tracer la relation sur ton diagramme de classes. Peu importe que l'héritage accepte l'héritage ou non à ce moment là : si LSP est respecté, tu peux envisager l'héritage. Si LSP n'est pas respecté, tu ne peux pas l'envisager, quoi que te dise le langage. Un point, c'est tout.

    De plus, il faut comprendre que l'on peut diviser toutes les classes et les structures que nous allons créer en deux grandes catégories en fonction de la sémantique que l'on va leur donner. Nous aurons donc
    • des classes à sémantique de valeur, qui n’intégreront jamais une relation d'héritage, mais qui autorisent la copie, l'affectation et la comparaison (ad minima par égalité) et
    • des classes à sémantique d'entité, qui sont de parfaites candidates pour être utilisées dans une relation d'héritage, qui n'autorisent ni la copie, ni l'affectation et qui rendent la comparaison inutile

    Des classes de type Position2D et Position3D entrent très certainement dans la catégorie des classes ayant sémantique de valeur, et ne devraient donc en aucun cas servir dans une relation d'héritage.

    A l'inverse, une classe Vehicule entre très certainement dans la catégorie des classes ayant sémantique d'entité. MAIS, comme l'héritage représente une relation "EST-UN" et que l'on ne peut décemment pas estimer (comme l'a si bien fait remarquer ternel) qu'un véhicule EST UN(E) position, il n'y a absolument aucun sens à faire hériter la classe Vehicule de la classe PositionXD. D'autant plus que ces classes PositionXD n'ont rien à faire dans une relation d'héritage.

    Alors, oui, bien sur, nous pouvons faire preuve "d'un peu de souplesse" face à des cas clairement introduits en tant qu'exemple. Et nous le faisons généralement. Mais, pour que nous puissions faire preuve de cette souplesse, il faut que les exemples présentés soient un minimum corrects du point de vue conceptuel. Or, ton exemple ne l'est absolument pas.
    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

  8. #8
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 493
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par mok_tun Voir le message
    Bonjour,
    Depuis un bon moment si tu rajoutes la troisième dimension "z" .
    Tu peux apprendre un peu de géométrie dans l'espace, également ci-dessous un exemple:
    https://fr.wikibooks.org/wiki/Progra...sses/Exercices

    Merci
    Tu devrais remettre tes lunettes et constater que dans la solution de l'exercice, l'héritage n'est pas public :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    class Position2D
    {
    ...
    };
     
    class Position3D : Position2D
    {
    ...
    };
    Et ça change tout ! Ca change notamment le fait qu'une position 3D N'est PAS une position 2D. Elle s'implémente grâce à une position 2D en y rajoutant une dimension. Et c'est totalement différent.

  9. #9
    Expert confirmé
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 599
    Par défaut
    Citation Envoyé par mok_tun Voir le message
    Bonjour,
    Depuis un bon moment si tu rajoutes la troisième dimension "z" .
    Tu peux apprendre un peu de géométrie dans l'espace, également ci-dessous un exemple:
    https://fr.wikibooks.org/wiki/Progra...sses/Exercices

    Merci
    En effet, ton exemple est directement issu de wikibooks. Même un débutant ne devrait pas imaginer une telle structure. En regardant, les solutions sont elles aussi écrites par une personne ne connaissant pas du tout le C++, il y a beaucoup trop d'erreurs. Cet article doit avoir son droit à l'oubli.

  10. #10
    Membre Expert
    Avatar de Pyramidev
    Homme Profil pro
    Tech Lead
    Inscrit en
    Avril 2016
    Messages
    1 513
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Tech Lead

    Informations forums :
    Inscription : Avril 2016
    Messages : 1 513
    Par défaut
    Citation Envoyé par dalfab Voir le message
    En effet, ton exemple est directement issu de wikibooks. Même un débutant ne devrait pas imaginer une telle structure. En regardant, les solutions sont elles aussi écrites par une personne ne connaissant pas du tout le C++, il y a beaucoup trop d'erreurs. Cet article doit avoir son droit à l'oubli.
    J'approuve entièrement les propos de dalfab.

    D'ailleurs, dans la solution, en plus de l'accumulation des mauvaises pratiques, le code suivant ne compile pas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Position3D()
    {
    Position2D::Position2D();
    z = 0;
    }
    Ce n'est pas comme ça qu'on appelle le constructeur de la classe parente. C'est peut-être ça qui a bloqué mok_tun.

    Ces exercices sont à jeter.

  11. #11
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par mok_tun Voir le message
    Bonjour à tous,
    J'ai définit 3 classes qui sont:
    Class Position2D: Classe de base
    Class Position3D: Classe dérivée de la classe Position2D (class Position3D : public Position2D)
    Class Vehicule : Classe dérivée de la classe Position3D (class Vehicule : public Position3D)
    Lorsque j'ai essayé d'accéder aux méthodes de la classe de base (Position2D) avec un objet qui est définit par la classe Vehicule, j'ai pas pu.
    J'ai fait une recherche mais j'étais un peu perdu, est-ce que il y a quelqu'un pourrait m'expliquer les solutions possibles pour palier cette interdiction d'accès ?

    Merci
    Bonjour
    Désolé si ma question est un peu hors sujet mais tu es vraiment "chercheur en informatique" comme c'est écrit dans ta signature ?

  12. #12
    Membre actif
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Juin 2015
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chercheur en informatique

    Informations forums :
    Inscription : Juin 2015
    Messages : 55
    Par défaut
    J ai eu la même sensation lorsque j'ai lu que tu es développeur informatique

  13. #13
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par mok_tun Voir le message
    J ai eu la même sensation lorsque j'ai lu que tu es développeur informatique
    Oui, j'ai eu mon master à l'université de Bordeaux il y a quelques années et je fais du dev depuis. Et toi, dans quelle université tu as obtenu ton doctorat ? Ton mémoire est disponible en ligne sur les sites habituels (www.theses.fr) ?

  14. #14
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 296
    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 296
    Par défaut
    Citation Envoyé par mok_tun Voir le message
    Depuis un bon moment si tu rajoutes la troisième dimension "z" .
    Tu peux apprendre un peu de géométrie dans l'espace, également ci-dessous un exemple:
    https://fr.wikibooks.org/wiki/Progra...sses/Exercices
    C'est une erreur de conception classique que nous avons tous commise en faisant comme dans/avec les bouquins/profs avec lesquels nous avons appris.

    Il n'est pas possible d'implémenter une opération d'égalité réflexive, symétrique, et transitive qui soit compatible avec le LSP -- cf Effective Java de Joshua Bloch pour la démo. La criticité 3 premières propriétés ne devraient pas choquer. Le LSP, est probablement la propriété SOLID la plus critique de toutes. Si les autres (SRP, OCP, DIP, ISP) nous aident à concevoir un truc maintenable, un héritage qui ne respecte pas le LSP est un héritage qui va finir en bug -- la démonstration réside dans une application simple de la programmation par contrat.

    NB: j'ai parlé d'operator==(), mais des problèmes identiques existent avec les autres opérations de comparaison, même quand on passe par des fonctions de hashage.

    La conclusion de tout cela, c'est que l'héritage public n'est techniquement pas applicable (dans un monde exempt de bugs) à des valeurs (copiables et comparables). En C++, il y a un autre problématique technique: la problématique du slicing.

    PS: le passage 3D -> 2D, c'est pas juste enlever une dimension (chose qui ne choque pas les informaticiens de formation qui voient juste des attrbiuts en plus ou un moins sans le moindre recul métier), mais de projeter vers un (hyper) plan (chose qui ne choque pas les scientifiques que je forme).

    PPS: si tu veux un bon exercice de conception OO en C++, je te recommande l'exercice du Javaquarium (tu trouveras les énoncés sur zeste De Savoir). Pour de la conception de classe valeur (avec les difficultés associées), écrire une classe matrice qui permet de supporter "cout << (m1 + m2 + m1);" est un bon début.

    PPPS: les attaques ad hominem n'apportent rien.

    PPPPS: Si quelqu'un se sent (et a le temps!) d'éditer le wikibook pour proposer un exercice plus intelligent et expliquer dans la page de discussion pourquoi tous ces héritages ne vont pas -- même si techniquement nous pourrions utiliser le privé, il n'est pas le plus important sur lequel faire travailler les débutants
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  15. #15
    Membre chevronné Avatar de fenkys
    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    376
    Détails du profil
    Informations personnelles :
    Âge : 58
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Octobre 2007
    Messages : 376
    Par défaut
    J'ai modifié le deuxième exercice. Pour le premier, je dois réfléchir un peu. La réponse ne correspond pas à l'énoncé.
    Mais du coup, j'ai aussi relu les explications du cours. Une refonte s'impose. Surtout dans les exemples.

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

Discussions similaires

  1. Problème d'héritage avec une classe abstraite
    Par Ph.denis dans le forum C++
    Réponses: 7
    Dernier message: 22/03/2008, 10h37
  2. héritage avec sql server
    Par yohann007 dans le forum MS SQL Server
    Réponses: 0
    Dernier message: 30/08/2007, 21h30
  3. Héritage avec tables liées à une autre base
    Par b_steph_2 dans le forum Access
    Réponses: 13
    Dernier message: 27/02/2007, 11h17
  4. Generics et héritage avec Java 5.0 Tiger
    Par euyeusu dans le forum Langage
    Réponses: 3
    Dernier message: 17/01/2007, 11h41
  5. Utiliser un héritage avec exclusion mutuelle correctement
    Par akecoocoo dans le forum Décisions SGBD
    Réponses: 2
    Dernier message: 20/11/2005, 22h54

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