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 :

[débutant] appel de la fonction d'une super-classe


Sujet :

C++

  1. #1
    Membre éclairé Avatar de Higestromm
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    516
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 516
    Par défaut [débutant] appel de la fonction d'une super-classe
    Bonjour,

    Je me heurte à un probleme vraiment con mais je trouve pas ma solution.

    J'ai une classe A et une classe B;
    B hérite de A.

    B surcharge un fonction virtuelle de A qui s'apelle Truc();

    Quand je définit ma fonction Truc() dans B j'aimerais appeler Truc() de A.

    j'ai essayer ca :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void B::Truc()
    {
        ((A*)this)->Truc();
    }
    Mais ca marche pas...

    Quelqu'un sait comment faire ?

    Merci

  2. #2
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void B::Truc()
    {
        A::Truc();
    }
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  3. #3
    Membre chevronné
    Profil pro
    Inscrit en
    Février 2003
    Messages
    311
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2003
    Messages : 311
    Par défaut
    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
    class A
    {
    protected:
            virtual Truc()
            {
                    //blabla
            };
    public:
            A() {}
    };
     
    class B : public A
    {
    private:
            Truc()
            {
                    A::Truc();
                    //blabla
            };
    public:
            B() {}
    };

  4. #4
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 296
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 296
    Par défaut
    Le pattern template method est pas mal quand on peut.
    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
    struct A {
        void f() {
            code commun...
            int z = do_f1(42);
            code commun...
            do_f2();
        }
    private:
        virtual int  do_f1(int) = 0;
        virtual void do_f2()    = 0;
    };
     
    struct B : A {
    private:
        virtual int  do_f1(int) { ... }
        virtual void do_f2()    { ... }
    };
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  5. #5
    Membre éclairé Avatar de Higestromm
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    516
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 516
    Par défaut
    Merc pour vos réponses... c'est horrible après un ptit séjour Java le trucs que l'on oublie

  6. #6
    Membre chevronné
    Profil pro
    Inscrit en
    Février 2003
    Messages
    311
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2003
    Messages : 311
    Par défaut
    Citation Envoyé par Luc Hermitte
    Le pattern template method est pas mal quand on peut.
    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
    struct A {
        void f() {
            code commun...
            int z = do_f1(42);
            code commun...
            do_f2();
        }
    private:
        virtual int  do_f1(int) = 0;
        virtual void do_f2()    = 0;
    };
     
    struct B : A {
    private:
        virtual int  do_f1(int) { ... }
        virtual void do_f2()    { ... }
    };
    Ca oblige A à implémenter toutes les fonctions qui peuvent être appellées, et chaque fonction à être définie dans chacune des classes qui dérivent de A.

    Ca me parait pas très adapté à son cas...

    Je vois pas trop l'intérêt en fait de ce pattern... Tu l'utilises à quel moment?

  7. #7
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Moi je trouve au contraire ce design pattern très utile, ça permet d'une part de ne pas avoir des fonctions virtuelles qui doivent impérativement commencer ou finir par appeler la même fonction de la classe de base (un oubli est si vite arrivé), et d'autre part de centraliser la logique de code au sein de la classe mère et de ne déléguer aux dérivées que les parties qui leur sont vraiment spécifiques.

    Un exemple tout bête :

    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
    class Control
    {
    public :
     
        virtual void OnEvent(...)
        {
             // Trucs communs à tous les types de contôles
        }
    };
     
    class Button : public Control
    {
    public :
     
        void OnEvent(...)
        {
             Control::OnEvent(...);
     
            // Trucs spécifiques aux boutons
        }
    };
    Et bien moi je préfère cette version :

    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 Control
    {
    public :
     
        void OnEvent(...)
        {
             // Trucs communs à tous les types de contôles
     
             ProcessEvent();
        }
     
    private :
     
        virtual void ProcessEvent() = 0;
    };
     
    class Button : public Control
    {
    private :
     
        void ProcessEvent(...)
        {
            // Trucs spécifiques aux boutons
        }
    };

  8. #8
    Expert confirmé

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 756
    Billets dans le blog
    3
    Par défaut
    La question est, je pense, de savoir si c'est un code commun ou une implémentation par défaut. Dans le cas des events, souvent on souhaite pouvoir remplacer le traitement par défaut :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    class MyWindow : public Window
    { 
    public : 
        virtual void OnClose() 
        { 
             bool ok = MsgBox( "Voulez-vous vraiment quitter ?" );
             if ( ok )
             {
                 Window::OnClose();
             }
        } 
    };
    Note que certains compilos offrent une extension à ce sujet, comme __super pour VC++.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void B::Truc() 
    { 
        __super::Truc(); 
    }
    un peu comme super en Java ou base en C#.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 16
    Dernier message: 30/01/2008, 15h27
  2. Appel d'une fonction dans une autre classe
    Par Analfabete dans le forum wxPython
    Réponses: 3
    Dernier message: 01/10/2007, 09h45
  3. Appel de la fonction d'une autre classe
    Par Ggamer dans le forum Général Python
    Réponses: 3
    Dernier message: 17/09/2007, 16h14
  4. [Joomla!] appel de fonction d'une autre classe dans un autre fichier
    Par lkryss dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 5
    Dernier message: 27/07/2007, 16h55
  5. problème d'appel d'une fonction d'une autre classe
    Par kifouillou dans le forum Langage
    Réponses: 5
    Dernier message: 08/02/2007, 17h42

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