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

  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