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++

  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 !

  7. #7
    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
    Du coup, si on a une hi�rarchie � 3 niveaux, cela donne :

    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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    class A
    {
    public:
       void Apply()
       {
          ...;
          ApplyImpl();
       }
     
    private:
       virtual ApplyImpl();
    };
     
    class B : public A
    {
    public:
       void ApplyImpl()
       {
          ...;
          ApplyImpl2();
       }
     
    private:
       virtual ApplyImpl2();
    };
     
    class C : public B
    {
    public:
       void ApplyImpl2()
       {
          ...;
       }
    }
    ;
    C'est bien �a ?
    Si oui, cela implique donc un ajout de fonction virtuelle par g�n�ration, sauf pour les feuilles. Moins de boulot de saisie, mais quelques inconv�nients � l'ex�cutions, non ?

    Ce n'est pas une critique; c'est seulement pour que je comprenne.

    Note: j'ai une hi�rarchie avec au maximum 5 niveaux, et de nombreuses feuilles.

  8. #8
    R�dacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par d�faut
    Seuls les constructeurs et destructeurs sont appel�s 'automatiquement' le long de l'arbre d'h�ritage.
    Il est vrai qu'avec un une profondeur sup�rieure � 2, la m�thode propos�e devient vite laborieuse. Mais pr�supposer que tu auras besoin d'appeler la fonction de chaque �tape est �trange. Peut �tre as-tu trop de responsabilit� dans ta m�thode et qu'il faut associer une hi�rarchie d'objet 'pr�parateur' qui pourrait 'remonter' ta hi�rarchie premi�re.

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