Partage
  • Partager sur Facebook
  • Partager sur Twitter

Probléme override, virtual classe

Probléme override, virtual classe

    18 septembre 2017 à 19:00:56

    Bonjour,

    J'ai écrit ce code, qui compile parfaitement bien si je n'ajoute pas le mot override dans la classe scooter (Apparament c'est une bonne habitude à prendre de l'ajouter)

    Pouvez vous me dire pourquoi cela me génère une erreur?

    #include <iostream>
    #include <string>
    
    class Vehicule{
        public:
            virtual std::string getColor(){
                return "Bleu";
            }
    };
    
    class Scooter : public Vehicule{
        public:
            std::string override getColor(){
                return "Rouge";
            }
    };
    
    int main()
    {
        Vehicule *vh = new Scooter;
        std::cout << vh->getColor();
        return 0;
    }
    

    Debugger:

    ||=== Build: Debug in virtual (compiler: GNU GCC Compiler) ===|
    /home/user/Documents/Programmation/C++/Code::Block/virtual/main.cpp|13|error: expected ‘;’ at end of member declaration|
    /home/user/Documents/Programmation/C++/Code::Block/virtual/main.cpp|13|error: ISO C++ forbids declaration of ‘getColor’ with no type [-fpermissive]|
    /home/user/Documents/Programmation/C++/Code::Block/virtual/main.cpp|13|error: conflicting return type specified for ‘virtual int Scooter::getColor()’|
    /home/user/Documents/Programmation/C++/Code::Block/virtual/main.cpp|6|error:   overriding ‘virtual std::__cxx11::string Vehicule::getColor()’|
    /home/user/Documents/Programmation/C++/Code::Block/virtual/main.cpp||In member function ‘virtual int Scooter::getColor()’:|
    /home/user/Documents/Programmation/C++/Code::Block/virtual/main.cpp|14|error: invalid conversion from ‘const char*’ to ‘int’ [-fpermissive]|
    ||=== Build failed: 5 error(s), 0 warning(s) (0 minute(s), 0 second(s)) ===|
    

    Je ne comprends pas les erreurs, sans le override ça marche nickel.

    En vous remerciant d'avance.


    -
    Edité par 238 18 septembre 2017 à 19:03:44

    • Partager sur Facebook
    • Partager sur Twitter
      18 septembre 2017 à 20:13:28

      Override est un modifier qui se place à la fin de la signature

      #include <iostream>
      #include <string>
       
      class Vehicule{
          public:
              virtual std::string getColor(){
                  return "Bleu";
              }
      };
       
      class Scooter : public Vehicule{
          public:
              std::string getColor()override {
                  return "Rouge";
              }
      };
       
      int main()
      {
          Vehicule *vh = new Scooter;
          std::cout << vh->getColor();
          return 0;
      }



      -
      Edité par romantik 18 septembre 2017 à 20:13:48

      • Partager sur Facebook
      • Partager sur Twitter
      Dream on, Dream on, Dream until your dream comes true
        18 septembre 2017 à 20:17:22

        Tout bêtement : le mot clé override se place après la déclaration.

        std::string getColor() override{
            return "Rouge";
        }

        (Quant à ta fonction main, tu as une fuite mémoire. Regarde du côté des pointeurs intelligents, ou passe par une référence tout simplement.)

        EDIT: grillé

        -
        Edité par Olybri 18 septembre 2017 à 20:17:41

        • Partager sur Facebook
        • Partager sur Twitter
          18 septembre 2017 à 20:57:08

          Merci pour éclaircissement :)

          Arta.

          • Partager sur Facebook
          • Partager sur Twitter
            18 septembre 2017 à 22:45:48

            Salut,

            Ceci étant dit, cette utilisation de la virtualité, même si elle permet de  comprendre le principe, est très largement superflue:

            Comme on peut partir du principe que tout véhicule sera peint en une couleur, mais que la couleur n'a rien à voir avec le type de véhicule, nous sommes clairement dans le cas où une fonction membre non virtuelle associée à  une donnée membre serait tout aussi efficace ;).

            Pour bien comprendre la virtualité, il s'agit de bien comprendre que ce que l'on espère, c'est de voir le comportement s'adapter au type de l'objet à partir duquel il est appelé.

            Or, dans le cas que tu nous présente, tu ne fais que faire varier le résultat de ce comportement, alors que tu pourrais très bien obtenir une telle variation autrement.

            Un cas plus "sensé" de fonction virtuelle serait obtenu en créant des classes (ex : rectangle, cercle, triangle) qui héritent de "forme", et en modifiant le comportement d'une fonction "perimeter" ou d'une fonction "surface", car le calcul de ces deux informations doit, bel et bien, s'adapter selon l'élément pour lequel on veut les calculer ;)

            Il y aurait bien d'autres choses à dire à partir de ton petit bout de code, mais je vais m'arrêter là ;)
            • Partager sur Facebook
            • Partager sur Twitter
            Ce qui se conçoit bien s'énonce clairement. Et les mots pour le dire viennent aisément.Mon nouveau livre : Coder efficacement - Bonnes pratiques et erreurs  à éviter (en C++)Avant de faire ce que tu ne pourras défaire, penses à tout ce que tu ne pourras plus faire une fois que tu l'auras fait
            Anonyme
              19 septembre 2017 à 1:13:32

              koala01 a écrit:

              [...] Il y aurait bien d'autres choses à dire à partir de ton petit bout de code, mais je vais m'arrêter là ;)

              Tout à fait d'accord : entre autres ceci par exemple, à condition bien sûr qu'au moins une fonction de la classe soit polymorphe (cf. virtual). Et il y a aussi le contenu du main() qui pique les yeux; enfin bon...
              • Partager sur Facebook
              • Partager sur Twitter

              Probléme override, virtual classe

              × 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