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 :

héritage et pointeur générique de type classe mere


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    613
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 613
    Par défaut héritage et pointeur générique de type classe mere
    Bonjour,

    C'est peut etre un peu tordu, mais ca me parait pratique de pouvoir faire ça, est-ce possible ? :

    Soit une classe mere A qui possede une fonction public : f_public()
    Soit des classes B et C qui héritent de A
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
          A
       ------
       |    |
       B    C
    Maintenant, j'ai un callback qui prend en parametre un pointeur sur une classe de type void * :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    static void callback( void * MaClasse)
    Au debut de mon callback, je dois donc caster MaClasse pour pouvoir appeller f_public(). Mais comme f_public() fait partie de A, je voudrais faire en sorte que mon callback accepte indifférement une classe de type B ou C.
    Comment faire quelque chose du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    static void callback( void * MaClasse){
        A *classe = (A*)MaClasse;
        classe->f_public();
    }
    Sachant donc que MaClasse peut etre de type B ou C et non A

    Merci

    Edit :
    Ou alors une autre solution éventuelle ? :
    Lorsque je définit le param de mon callback, si j'ai un pointeur de type :
    B *classe
    Est ce qu'il y a un moyen d'avoir le pointeur vers la classe mere a partir de classe.
    Comme ca je pourrait toujours envoyer un pointeur de type A* quelque soit le type de ma sous-classe.

  2. #2
    Membre Expert
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 963
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 963
    Par défaut
    f_public doit être virtual…

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    35
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 35
    Par défaut
    Citation Envoyé par JeitEmgie Voir le message
    f_public doit être virtual…
    J'ai pensé aussi au début qu'il cherchait à utiliser une fonction virtuelle, mais sa fonction f_public est visiblement une fonction de A uniquement.

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    613
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 613
    Par défaut
    Citation Envoyé par P@ulo Voir le message
    Déjà, évite d'utiliser des pointeurs void en C++, C'EST MAL. (Ça mange les enfants et tout...)
    Ce n'est pas moi qui ai écrit ce callback. Mais de tout façon un paramètre de callback, pour être générique, je ne vois pas comment faire autrement qu'avec un void *
    Tu peux ensuite l'appeler avec une instance de B ou de C comme argument ! Ça marchera puisque comme B et C héritent de A, toute objet de type B ou de type C est aussi de type A.
    C'est magique le C++
    Merci, je vais essayer ca !

    J'ai pensé aussi au début qu'il cherchait à utiliser une fonction virtuelle, mais sa fonction f_public est visiblement une fonction de A uniquement.
    Effectivement, ma fonction n'est définie que dans A

  5. #5
    Alp
    Alp est déconnecté
    Expert confirmé

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Par défaut
    Citation Envoyé par pasdeface Voir le message
    Ce n'est pas moi qui ai écrit ce callback. Mais de tout façon un paramètre de callback, pour être générique, je ne vois pas comment faire autrement qu'avec un void *
    Les templates ?

    En C tu n'as que void*, en C++ c'est bien plus simple. Tu as même des bibliothèques qui font déjà tout le boulot à ta place, comme boost.function.

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    613
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 613
    Par défaut
    Citation Envoyé par Alp Voir le message
    Les templates ?

    En C tu n'as que void*, en C++ c'est bien plus simple. Tu as même des bibliothèques qui font déjà tout le boulot à ta place, comme boost.function.
    Ok. Mais ce callback est passé à une librairie tierce écrite en C, donc c'est pour ça que le type du parametre doit etre un void *

    JeitEmgie : merci pour les précisions.

  7. #7
    Membre Expert
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 963
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 963
    Par défaut
    Citation Envoyé par pasdeface Voir le message
    Ce n'est pas moi qui ai écrit ce callback. Mais de tout façon un paramètre de callback, pour être générique, je ne vois pas comment faire autrement qu'avec un void *

    Merci, je vais essayer ca !


    Effectivement, ma fonction n'est définie que dans A
    la définir "virtual" garantit simplement que le jour où vous implémentez f_public() dans une sous-classe de A, la callback continue à fonctionner comme on l'espère : càd en appelant la f_public() de la classe dont l'objet en paramètre est effectivement membre…

    sinon vous avez juste créé un problème caché : cela ne fonctionne QUE parce que f_public() est implémentée uniquement dans la classe dont vous faites le cast dans la callback…

    au niveau déclaration, la callback pourrait tout aussi bien accepter un paramètre (A *maClasse)… si vous déclarez "class B : public A" et non "class B : A"…

    sans "virtual" et avec des f_public() dans les sous-classes, il faudrait activer RTTI pour pouvoir appeler dans la callback la "bonne" f_public()…

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    35
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 35
    Par défaut
    J'ai peut être mal compris, mais ce que tu cherches à faire est très facile, c'est même l'un des principes de base du C++

    Déjà, évite d'utiliser des pointeurs void en C++, C'EST MAL. (Ça mange les enfants et tout...)

    Il te suffit de définir ta fonction comme ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    static void callback(A *MaClasse)
    {
        MaClasse->f_public();
    }
    Tu peux ensuite l'appeler avec une instance de B ou de C comme argument ! Ça marchera puisque comme B et C héritent de A, toute objet de type B ou de type C est aussi de type A.
    C'est magique le C++

    D'ailleurs, la syntaxe suivante est parfaitement valide:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    B *b = new B;
    C *c = new C;
    A *a;
     
    a = b;     // valide
    a = c;     // valide
    Mais évidemment b=a serait invalide...

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

Discussions similaires

  1. Réponses: 12
    Dernier message: 21/05/2014, 14h17
  2. appel d'une methodes classe fille de type classe mere
    Par Mephista dans le forum Langage
    Réponses: 8
    Dernier message: 29/10/2011, 23h05
  3. Réponses: 3
    Dernier message: 23/09/2010, 16h52
  4. Réponses: 6
    Dernier message: 22/07/2010, 15h17
  5. Pointeur générique vers d'autres types d'objets
    Par LapinGarou dans le forum MFC
    Réponses: 11
    Dernier message: 15/09/2006, 16h48

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