Partage
  • Partager sur Facebook
  • Partager sur Twitter

Base class intermédiaire : faut-il override ?

    4 juillet 2024 à 19:03:06

    Salut tout le monde !

    J'ai un code avec une hiérarchie de classes :

    class A {
     public:
      virtual void foo() = 0;
    };
    
    class B : public A {
     public:
      void foo() override = 0;
    };
    
    class C : public B {
     public:
      void foo() override { std::cout << "C::foo()" << std::endl; }
    };

    Ici, on voit que la classe A contient une méthode virtuelle pure qui est override par une méthode de la classe B qui est virtuelle pure également.

    C'est la classe C qui hérite de B qui implémente la méthode foo().

    Est-ce que cette notation est correcte pour la méthode B::foo() ?

    void foo() override = 0;

    Je pose la question car je ne vois pas souvent ce genre de manière de faire car souvent les héritages entre les classes sont simples :

    A

    |

    B

    Or ici le schéma est plus complexe :

    A

    |

    B

    |

    C


    Je pense déjà que ce code est juste mais je préfère poser la question pour m'en assurer car dans les documentations, on voit plus souvent des relations d'héritage simple avec un seul parent et 1 ou 2 enfants alors que parfois la hiérarchie est plus complexe.

    Merci d'avance !

    -
    Edité par ThomasAirain 4 juillet 2024 à 19:08:18

    • Partager sur Facebook
    • Partager sur Twitter
      4 juillet 2024 à 19:08:44

      Bonjour,

      Oui, il faut écrire override, sous peine d'avertissement.
      Sinon on peut plus simplement enlever la ligne 8.

      • Partager sur Facebook
      • Partager sur Twitter
        4 juillet 2024 à 19:30:42

        Ok donc la ligne 8 est correcte mais l’idéal serait de la supprimer alors ? Je travaille sur un code qui appartient à une entreprise et les développeurs d’avant ont jugé bon de définir la méthode foo() à la fois dans la classe parent top-level et la classe parent intermédiaire.

        En fait je trouve que le C++ propose bien les mots clé pour implémenter les classes parents avec virtual et les classes enfants avec override mais on nous laisse plus dans le flou pour les classes qui sont parents et enfants en même temps.

        -
        Edité par ThomasAirain 4 juillet 2024 à 19:31:57

        • Partager sur Facebook
        • Partager sur Twitter
          4 juillet 2024 à 21:47:46

          ThomasAirain a écrit:

          En fait je trouve que le C++ propose bien les mots clé pour implémenter les classes parents avec virtual et les classes enfants avec override mais on nous laisse plus dans le flou pour les classes qui sont parents et enfants en même temps.

          La question est pourquoi faire ?

          Quel problème veux tu éviter dans les classes "intermédiaires" ?

          A quoi sert ta fonction B::foo() ?

          Quand on veut écrire une fonction qui override une fonction virtuelle dans une classe parent, on peut se tromper dans la signature (ou la signature de la fonction dans la classe parent est changée sans que les classes enfants soient changées), ce qui va déclarer une nouvelle fonction et pas un override. Le mot clé "override" sert à être sur qu'on override bien et qu'on déclare pas une nouvelle fonction.

          Dans ton code, au mieux, tu veux pas déclarer une nouvelle fonction virtuelle, donc il faut mettre override. Mais comme c'est une fonction virtuelle pure, elle sert a rien. Donc le mieux est encore de la virer.

          • Partager sur Facebook
          • Partager sur Twitter
            4 juillet 2024 à 23:29:40

            Tu peux désactiver -Weverything

            -
            Edité par Autechre 5 juillet 2024 à 20:57:37

            • Partager sur Facebook
            • Partager sur Twitter
              4 juillet 2024 à 23:42:13

              -Weverything is generalement pas conseillé sur les vrais projets, il y a trop de warnings et surtout trop de faux positifs. 

              Et dans le cas de fonction override pure, autant les supprimer qu'ajouter le mot clé override. Ca chamboule rien.

              • Partager sur Facebook
              • Partager sur Twitter
                4 juillet 2024 à 23:56:30

                -Weverything à retirer

                -
                Edité par Autechre 5 juillet 2024 à 20:57:56

                • Partager sur Facebook
                • Partager sur Twitter
                  5 juillet 2024 à 9:18:12

                  Au moins ça fournit un entraînement à détecter les vrais positifs en les distinguant des faux, plutôt que se cacher la tête dans le sable pour ne pas les voir.

                  Une occasion aussi de rectifier les faux (c'est raisonnable de mettre les override pour les méthodes qui ont vocation à en surcharger une autre), ou les annoter si c'est trop galère , pour que le suivant ne perde pas de temps avec à essayer de comprendre pourquoi c'est un faux positif 

                  -
                  Edité par michelbillaud 5 juillet 2024 à 9:25:47

                  • Partager sur Facebook
                  • Partager sur Twitter

                  Base class intermédiaire : faut-il override ?

                  × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                  • Editeur
                  • Markdown