Partage
  • Partager sur Facebook
  • Partager sur Twitter

classe virtuelle et implémentation

besoin d'aide

Sujet résolu
Anonyme
    6 mars 2008 à 19:30:18

    Bonjour j'aimerais avoir besoin d'aide et savoir si il est possible de faire ca :
    1. class VObject
    2. {
    3.    public:
    4.       virtual void fonction(VObject *) = 0 ;
    5. };
    6. class Object
    7. {
    8.    public:
    9.       void fonction(Object *);
    10. }


    Je sais que nous pouvons redéfinir une méthodes en changeant le paramètre de retour, mais peut on modifier les arguement.

    Merci
    • Partager sur Facebook
    • Partager sur Twitter
      6 mars 2008 à 20:02:06

      Sachant que tes fonctions font partie d'une classe différente, tu peux nommer tes méthodes sans regarder si elle convient à une autre méthode d'une autre classe.
      Par contre si ils font partie de la même classe tu dois regarder la signature pour savoir si tu peux faire ça.
      La signature c'est: le prototype - le type de retour.

      Pour ta première fonction: fonction(VObject *)
      Pour ta seconde fonction: fonction(Object *)

      Comme tu vois le type du paramètre de la fonction est différent. Une reçoit en paramètre un objet appartenant à la classe VObject et l'autre un objet appartenant à la classe Object. Donc même dans la même classe, ces fonctions peuvent être utilisées en même temps.
      • Partager sur Facebook
      • Partager sur Twitter
      Anonyme
        6 mars 2008 à 20:23:46

        Non ce que je voulais savoir c'était considérer comme la même méthode... Car j'en avais besoin.
        • Partager sur Facebook
        • Partager sur Twitter
        Anonyme
          6 mars 2008 à 20:38:29

          Nan, pour utiliser les fonctions polymorphique elle doivent avoir la même signature, sinon c'est une autre fonction (je met à part les valeures de retours covariantes ce qui correspond à ton passage "Je sais que nous pouvons redéfinir une méthodes en changeant le paramètre de retour" et encore seulement dans certains cas).

          Mais un Object étant un VObject, tu peux en gardant ta signature de départ:
          *utiliser le polymorphisme avec ton argument (bien)
          *utiliser un dynamic_cast sur ton pointeur (moyen).

          Djad>> T'es pas obligé de répondre, surtout pour dire n'importe quoi.
          • Partager sur Facebook
          • Partager sur Twitter
            6 mars 2008 à 21:05:31

            Citation : Davidbrcz

            Djad>> T'es pas obligé de répondre, surtout pour dire n'importe quoi.



            En même temps il a répondu de travers par rapport à ce que @Strato@ souhaitait entendre car il avait remarqué que @Strato@ n'avait pas ça classe Object dérivée de VObject (dans son code).
            • Partager sur Facebook
            • Partager sur Twitter
            Anonyme
              6 mars 2008 à 21:12:40

              Il parle de fonction virtuelle et vu le nom des classes, l'héritage est 'implicite' bien qu'il est vrai qu'il n'y en ai pas ici.
              half méa culpa.

              Edit: vu le code d'après, j'avais raison.
              • Partager sur Facebook
              • Partager sur Twitter
              Anonyme
                6 mars 2008 à 21:18:30

                Je suis désolé. J'ai commis une erreur. Je viens de voir. Voilà mes classes :
                1. class VObject
                2. {
                3.    public:
                4.       virtual void fonction(VObject *) = 0 ;
                5. };
                6. class Object : public VObject
                7. {
                8.    public:
                9.       void fonction(Object *);
                10. }
                • Partager sur Facebook
                • Partager sur Twitter
                Anonyme
                  6 mars 2008 à 21:46:30

                  @Strato@ : Tu as lu ma 1er réponsse ?
                  • Partager sur Facebook
                  • Partager sur Twitter
                  Anonyme
                    6 mars 2008 à 21:48:02

                    Oui mais c'était pour que tout le monde comprennent bien mon problème...


                    merci.
                    • Partager sur Facebook
                    • Partager sur Twitter
                      6 mars 2008 à 22:59:36

                      Comme précisé, les retours covariants sont effectivement supportés en C++ si on respecte le fait qu'il doit y avoir un héritage (public?) entre les types de retour.

                      La contra-variance (je crois que c'est comme ça que l'on dit), que l'on voit dans le code montré, n'est elle pas supportée en C++. Il te faudra downcaster (ou autre) pour retrouver le type dynamique à partir du type statique. Ou réorganiser ton code si cela est possible (sans le compliquer inutilement pour autant)
                      (tu trouveras des liens vers des articles sur le wikipédia anglais si tu veux approfondir la théorie derrière tout cela)

                      PS: "classe virtuelle" ne veut rien dire en C++. Ici, il y a une classe abstraite, et des fonctions membres virtuelles.
                      • 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.
                        7 mars 2008 à 8:49:21

                        Citation : lmghs

                        PS: "classe virtuelle" ne veut rien dire en C++. Ici, il y a une classe abstraite, et des fonctions membres virtuelles.



                        Ne parle-t'on pas de classe virtuelle dans le cas d'un héritage virtuel ?
                        • Partager sur Facebook
                        • Partager sur Twitter
                        Co-auteur du cours de C++. ||| Posez vos questions sur le forum ||| Me contacter.
                          7 mars 2008 à 10:29:06

                          Non. Classe de _base_ virtuelle.
                          La classe a son côté virtuel uniquement dans le cadre d'un héritage donné. Ce n'est pas une propriété qui lui est propre.

                          1. struct B : A {};
                          2. struct C : virtual A {};

                          A est classe de base virtuelle pour C et ses descendants, pas pour B. Et cela peut être encore plus compliqué.
                          1. struct D : C {};
                          2. struct E : virtual A {};
                          3. struct F : E, D, B {};

                          F "contient" 2 A : un partagé entre C-D et E, et un qui vient de B.
                          • 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.

                          classe virtuelle et implémentation

                          × 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