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 :

Polymorphisme : appel automatique de la fonction du parent


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 766
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 766
    Par défaut Polymorphisme : appel automatique de la fonction du parent
    Hello,

    J'ai une fonction que je définis polymorphiquement dans une classe de base, et qui est redéfinie plusieurs fois en descendant dans la hiérarchie. Ce qui commun est codé le plus haut possible dans la hiérarchie.

    On a donc :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    class A
    {
        virtual void process()
        {
            ...;
        }
    };
     
    class B : public A
    {
        virtual void process()
        {
            A::process();
            ...;
        }
    };
     
    class C : public B
    {
        virtual void process()
        {
            B::process();
            ...;
        }
    };
    Y a-t-il moyen de faire en sorte que chaque classe enfant appelle automatiquement la fonction équivalente de son parent ?

    Merci.

  2. #2
    Membre expérimenté
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    188
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 188
    Par défaut
    Si je comprend bien tu voudrai ne pas avoir à écrire A::process(); dans B::process(). Parce que sa coute pas très cher de l'écrire quand même .

  3. #3
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 766
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 766
    Par défaut
    Ben si un des process() de A est défini comme virtuel pur, que des dizaines de classes héritent de A, et que tu décides de finalement faire une implémentation pour A, faut revenir dans toutes les classes enfant pour explicitement appeler A::process().

    C'est faisable, mais ça vaut le coup de se poser la question, non ? :-)

  4. #4
    Membre Expert
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Par défaut
    Fais attention dans ton exemple, tu n'as pas d'héritage, et tu as deux classes B !
    Citation Envoyé par oodini Voir le message
    C'est faisable, mais ça vaut le coup de se poser la question, non ? :-)
    Oui, ça vaut le coup de se poser la question. La réponse est toute bête, il suffit pas implémenter la fonction virtuelle de la classe fille, et elle prendra alors l'implémentation de la classe parent.

    Après pense au pattern template method, qui permettra en plus d'appliquer du NVI, et d'être un peu plus souple.

  5. #5
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 766
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 766
    Par défaut
    Citation Envoyé par poukill Voir le message
    Fais attention dans ton exemple, tu n'as pas d'héritage, et tu as deux classes B !
    Merci. c'est corrigé !

    Citation Envoyé par poukill Voir le message
    Oui, ça vaut le coup de se poser la question. La réponse est toute bête, il suffit pas implémenter la fonction virtuelle de la classe fille, et elle prendra alors l'implémentation de la classe parent.
    Non, car l'implémentation dans la classe fille rajoute des instructions par rapport à l'implémentation de la classe parent. Elle spécialise.
    Et la fonction parente factorise des instructions communes aux classes filles.

    Citation Envoyé par poukill Voir le message
    Après pense au pattern template method, qui permettra en plus d'appliquer du NVI, et d'être un peu plus souple.
    Intéressant, mais ça ne répond pas vraiment à mon problème.
    Par ailleurs, j'ai implémenté cette technique hier sans savoir que c'était un pattern, mais seule la fonction de la classe parent était appelée... Mais bon, c'est l'objet d'un autre thread. :-)

  6. #6
    Membre Expert
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Par défaut
    Si, ça répond au problème, d'après ce que j'ai compris
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    class A
    {
    public:
       void Apply()
       {
          ApplyImpl();
       }
     
    private:
       virtual ApplyImpl(); // avec éventuellement une implémentation par défaut.
    };
    Et paf, du coup, tes classes filles n'ont qu'une seule fonction à implémenter.
    Tu peux même rajouter un traitement dans Apply() qui est optionnel

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    class A
    {
    public:
       void Apply()
       {
          ApplyImpl();
          ApplyOptional();
       }
     
    private:
       virtual ApplyImpl(); // avec éventuellement une implémentation par défaut.
       virtual ApplyOptional() {}
    };
    Du coup t'as défini une structure pour un algo, c'est le template method !

Discussions similaires

  1. Appel automatique d'une fonction en shell
    Par jaljal dans le forum Linux
    Réponses: 11
    Dernier message: 20/09/2010, 09h56
  2. Appel automatique de fonctions
    Par dj_the_kid dans le forum Qt
    Réponses: 7
    Dernier message: 30/04/2009, 20h54
  3. Appel automatique d'une fonction au lancement
    Par greg2 dans le forum C++
    Réponses: 3
    Dernier message: 10/07/2007, 09h04
  4. Appeler une fonction du parent
    Par Johnbob dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 28/11/2006, 03h56
  5. Réponses: 4
    Dernier message: 01/07/2004, 19h15

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