Partage
  • Partager sur Facebook
  • Partager sur Twitter

Heritage?

Sujet résolu
    1 août 2007 à 21:47:34

    Bonsoir tout le monde,

    j'aimerais savoir si quelqu'un pourrait me renseigner (un peu) sur l'heritage. Je connais un peu; je sais que l'on peut crée une classe en lui attribuant les méthodes et attribut d'une autre classe de cette manière je crois :
    class Reptile : public Animal
    {
    //...
    };


    Peut-on me confirmer que c'est comme ca et niveau vocabulaire... est-ce que Reptile est une classe fille de Animal, la classe Mère ?

    Aussi, j'ai vu et je n'ai jamais vraiment compris clairement ce que faisais les mots-clés "friend" et "virtual" qui, je crois sont directement associer à l'héritage.

    Peut-on aussi m'expliquer la différence entre protected et private ? Je crois que les éléments private sont accessibles depuis la classe et que les éléments protected peuvent etre accessible depuis la classe et depuis les classes mère et fille...



    Enfin peut-on me confirmer tout cela et me donner de plus complète information ? Merci.
    • Partager sur Facebook
    • Partager sur Twitter
      1 août 2007 à 22:06:33

      Bonjour,

      Alors Reptile est un Animal (voit le plus comme ceci, je trouve que ca aide mieux à comprendre après c'est vrai que c'est personnel).

      "Friend": c'est un mot clef qui n'a rien à voir avec le concept de l'héritage, il permet simplement de dire à une class : "attention, ceci est une méthode ou class amie, donc elle peut accéder à notre partie private", mais les methodes ou class friend déclaré dans une class n'en font pas parti pour autant.

      void uneFonc();

      class A
      {
      };

      class B
      {
          friend void uneFonc();
          friend class A;
      }

      void uneFonc() // et non B::uneFonc
      {
      }


      "virtual": par contre ce mot clef est interressant, les animaux marchent non (la plus part) ? donc par exemple dans la class Animal, défini une méthode "void bouger();", dans Reptile tu vas hériter de cette méthode mais tout les animaux ne bouge pas forcement de la même manière. Il faut donc redéfinir la méthode bouger(), ceux que tu vas faire :

      class Animal
      {
      public:
          void bouger() { std::cout << "Animal bouge"; }
      }

      class Reptile : public Animal
      {
      public:
          void bouger() { std::cout << "Reptile bouge"; }
      }


      Seulement voilà, quand tu vas créer un reptile et que tu vas appeler bouger(), il va te marquer "Animal bouge", car la methode bouger() pointe sur celle de la class Animal, le mot clef virtual te permet d'éviter ce problème et je t'invte à essaier :) (tips: n'oublie pas le virtual sur les destructeurs ;) quand ton destructeur de reptile est différent de animal sinon il appelle pas celui de reptile :) et oui c'est valable pour les destructeurs aussi ;) )

      La différence entre private et protected est simple:
      Ce qui est protected sera hérité dans tes class filles, sera private et visible tandis que private sera aussi hérité mais non visible non modifiable par tes class filles.
      • Partager sur Facebook
      • Partager sur Twitter
        1 août 2007 à 22:07:46

        Citation : GimralasQS

        Peut-on me confirmer que c'est comme ca et niveau vocabulaire... est-ce que Reptile est une classe fille de Animal, la classe Mère ?


        oui

        Citation : GimralasQS

        Aussi, j'ai vu et je n'ai jamais vraiment compris clairement ce que faisais les mots-clés "friend" et "virtual" qui, je crois sont directement associer à l'héritage.


        friend : permet à une classe ou fonction d'avoir directement accès aux données privées et protégées de la classe en question.

        virtual : exemple :
        class A
        {
        public:
            f();
        };
        class B : public A
        {
        public:
            f();
        };
        A* pa = new B;
        pa->f(); // ici la fonction f de A est appellée
        // en rajoutant "virtual" devant la fonction f de A, cà sera la fonction f de B qui sera appellée
         



        Citation : GimralasQS

        Peut-on aussi m'expliquer la différence entre protected et private ? Je crois que les éléments private sont accessibles depuis la classe et que les éléments protected peuvent etre accessible depuis la classe et depuis les classes mère et fille...


        oui.
        • Partager sur Facebook
        • Partager sur Twitter
          1 août 2007 à 22:21:38

          Merci beaucoup à tous les deux ! :)

          Une petite confirmation : le mot-clé virtual doit etre ajouté dans la class mère mais pas forcément dans la class fille, c'est ca ?
          Aussi, pour reprendre mon exemple, dans la class Animal, un attribut int(j'invente) "taille" devrait etre protected et un attribut bool "etreVivant" devrait etre private, c'est ca? (bon je sais c'est pas recherché mais c'est pour l'exemple ^^ ).

          Merci de me confirmer et merci encore.



          EDIT:
          je viens de tester ce code que tu m'a donné
          #include <iostream>

          class Animal
          {
          public:
              void bouger() { std::cout << "Animal bouge" << std::endl; }
          };

          class Reptile : public Animal
          {
          public:
              void bouger() { std::cout << "Reptile bouge" << std::endl; }
          };

          int main (int argc, char** argv)
          {
              Animal animal;
              Reptile reptile;

              animal.bouger();
              reptile.bouger();

              return 0;
          }
           


          Ce code m'affiche :
          Animal bouge
          Reptile bouge


          Or, ne devrait-il pas m'afficher Animal bouge pour les 2 ?
          J'enlève la méthode bouger de Reptile et il hérite donc de celle de Animal et le code affiche donc 2x animal mais bon ca c'est normal.

          Serait-ce mon IDE qui serait intelligent et rajouterais virtual aux classes mères ? :p

          Peut-on m'aider sur ce point ?
          • Partager sur Facebook
          • Partager sur Twitter
            1 août 2007 à 22:37:46

            c'est normal, il faut faire:

            Animal* t1 = new Animal;
            Animal* t2 = new Reptile;
            • Partager sur Facebook
            • Partager sur Twitter
              1 août 2007 à 22:47:10

              Oui, je viens de voir ca avec le 2ème exemple...

              Mais je ne suis pas sur de comprendre la deuxième ligne...
              Enfin, je crois que demain matin je comprendrai :p .

              Enfin, pour etre sur : pourquoi créer un pointeur sur animal si c'est pour créer un reptile...?

              Merci d'avance.
              • Partager sur Facebook
              • Partager sur Twitter
                1 août 2007 à 23:05:45

                Citation : GimralasQS

                Enfin, pour etre sur : pourquoi créer un pointeur sur animal si c'est pour créer un reptile...?


                voilà ce qu'est (en partie) le polymorphisme. le fait de mettre un reptile dans un pointeur animal, va te servir si tu fais un tableau d'animaux contenant des reptiles, mammifères,...
                • Partager sur Facebook
                • Partager sur Twitter
                  4 août 2007 à 13:42:55

                  Ca veut dire que pour un jeu d'échec ou chaque piece est une classe distinct (ex: Roi, Dame), et que le plateau contient un pointeur vers l'objet correspondant, alors la solution c'est de déclarer un tableau de Piece* avec Piece la classe mère de Roi, Dame Fou etc... ?
                  • Partager sur Facebook
                  • Partager sur Twitter
                    4 août 2007 à 13:58:03

                    Je pense bien que c'est ça :)
                    • Partager sur Facebook
                    • Partager sur Twitter
                      4 août 2007 à 21:36:50

                      @BCedric : oui c'est ça... Mais jamais on ne ferait une classe par pièce pour les échecs, une seule classe suffit dans laquelle on met comme attribut les mouvements permis à la pièce.
                      • Partager sur Facebook
                      • Partager sur Twitter
                        5 août 2007 à 7:13:01

                        @psychoh13 : Pourquoi pas? Au fond même si les classes sont petites leurs but est d'être le plus spécialisé alors moi je trouve que l'exemple est bon! Tout dépend du programmeur et la façon de concevoir l'application.
                        • Partager sur Facebook
                        • Partager sur Twitter
                          5 août 2007 à 10:22:31

                          @MatteX : Je ne dis pas le contraire, c'est s^ur qu'on peut très bien faire une classe pour chaque pièce, mais c'est un peu comme tortiller du cul pour chier droit dans un escalier en colimaçon... Le nombre de pièces est toujours le même, les déplacement sont fixe, une pièce bouffée ne refait pas surface, etc. De plus, le jeu doit pouvoir vérifier le tableau dans son ensemble, faire une classe par pièce risque d'être beaucoup plus volumineux et gênant pour la compréhension ou la gestion des pièces.
                          • Partager sur Facebook
                          • Partager sur Twitter
                            5 août 2007 à 13:24:21

                            Une petite question encore:

                            Admettons que j'ai une class A (mère) et une class B (fille de A), la class A contient une fonction Amie (friend). Est-ce que la class B hérite de cela ? Càd est-ce que la fonction Amie dans A aura aussi acces aux éléments de B ?


                            Merci d'avance.

                            EDIT:
                            aussi, les éléments hérité de A dans B seront-ils bien initialisés par le constructeur de A ? et seront-ils bien libérés (allocation et surface) par le destructeur de A
                            • Partager sur Facebook
                            • Partager sur Twitter
                              5 août 2007 à 19:10:10

                              Citation : GimralasQS

                              EDIT:

                              aussi, les éléments hérité de A dans B seront-ils bien initialisés par le constructeur de A ? et seront-ils bien libérés (allocation et surface) par le destructeur de A

                              si tu as un new dans le constructeur de A et un delete dans son destructeur; lorsque tu feras appel à un objet B le constructeur et le destructeur de A seront appellés
                              • Partager sur Facebook
                              • Partager sur Twitter
                                6 août 2007 à 9:34:29

                                Seulement si je fais :
                                A* objet = new B;
                                Non ?

                                Si je fais
                                B objet;
                                , ce sera quand meme bien le constructeur et le destructeur de B ? et pour les elements hérité c'est le constructeur de A, non ?
                                • Partager sur Facebook
                                • Partager sur Twitter
                                  6 août 2007 à 9:56:49

                                  Toujours appellés!
                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                  C++: Blog|FAQ C++ dvpz|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS| Bons livres sur le C++| PS: Je ne réponds pas aux questions techniques par MP.
                                    6 août 2007 à 15:58:10

                                    tu peux toujours tester : fais un cout dans tes constructeurs et destructeurs et regarde le fonctionnement, je te conseille de faire ça dans une fonction et de faire une pause après son retour pour bien voir ce que fait un objet à sa "naissance" et à sa "mort".

                                    Tu peux aussi facilement testé la fonction amie de la même manière.
                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      6 août 2007 à 16:20:41

                                      Heu... oui en effet c'est une très bonne idée et qui me rassure quand je vois le resultat ^^
                                      Comme n'y ai-je pas pensé ? o_O

                                      Merci.
                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                        6 août 2007 à 23:10:05

                                        Boah t'inquiète pas, ce genre de réflexes vient avec le temps...
                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                          6 août 2007 à 23:44:44

                                          Tout ca me donne des idées.. Après le tuto de mateo sur l'héritage, ca serait une bonne idée de faire un TP SDL/C++ Jeu de plateau :) (si quelqu'un a du temps à tuer pendant le mois d'aout ^^)
                                          • Partager sur Facebook
                                          • Partager sur Twitter
                                          Inkamath on GitHub - Interpréteur d'expressions mathématiques. Reprise du développement en cours.

                                          Heritage?

                                          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                          × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                          • Editeur
                                          • Markdown