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

Langage C++ Discussion :

Virtualité, polyphormisme et pointeur de fonction


Sujet :

Langage C++

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    199
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 199
    Par défaut Virtualité, polyphormisme et pointeur de fonction
    Bonjour, je travaillais quand j'ai commencé à me trituré de le cerveau avec le code ci-dessous, qui, bien evidement, m'a donné un résultat auquel je ne m'attendais pas :

    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
    #include <iostream> 
     
    struct A {
        virtual int a() { return 20; }
    };
     
     
    struct B : public A {
        virtual int a() { return -10; }
    };
     
     
    int main()
    {
        typedef int (A::*func)();
        func f = &A::a;
     
        B x;    
        std::cout << (x.*f)() << std::endl;
     
        return 1;
    }
    A l’exécution, dans la console on obtient -10. Et pourtant je pensais obtenir 20! Cela parce que mon pointeur de fonction aurait du appeler la fonction de la classe mère non?

    En fait la question que je me pose c'est de savoir s'il est possible (dans un cas similaire) depuis l’extérieur avec une instance de B, d’appeler la fonction A::a(), ou si la virtualité et la redéfinition l'en empêche?

    Merci, et bonne soirée!

  2. #2
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Par défaut
    Citation Envoyé par victor_gasgas Voir le message
    En fait la question que je me pose c'est de savoir s'il est possible (dans un cas similaire) depuis l’extérieur avec une instance de B, d’appeler la fonction A::a(), ou si la virtualité et la redéfinition l'en empêche?
    En précisant A::a :

    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
    #include <iostream>
     
    struct A {
        virtual int a() { return 20; }
    };
     
     
    struct B : public A {
        virtual int a() { return -10; }
    };
     
     
    int main()
    {
        B x;
        std::cout << x.A::a() << std::endl;
     
        return 1;
    }

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    199
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 199
    Par défaut
    Effectivement sa résous tout.

    Par contre comment faire pour utiliser les pointeurs de fonctions, toutefois si cela est possible.

    Merci!

  4. #4
    Rédacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supaéro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing Supaéro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Par défaut
    A vrai dire, je suis comme le PO, le sujet m'intrigue beaucoup. Je ne vois pas pourquoi le type dynamique (qui ici coïncide avec le type statique en plus !) intervient lors du choix de la fonction car on ne manipule pas de référence/pointeur.

    Et j'ai testé, un retrait de la virtualité donne la fonction A::a, prouvant que c'est bien du polymorphisme d'inclusion en jeu.

    La seule explication que je vois, c'est que du point de vu d'un pointeur de fonction, l'objet appliquant (celui sur lequel on applique le pointeur de fonction) est vu comme une référence ou un pointeur.

    Si quelqu'un pouvait éclairer ce point, ca serait sympa !
    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une très bonne doc sur le C++ (en) Why linux is better (fr)

  5. #5
    Membre Expert

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2004
    Messages
    1 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 391
    Par défaut
    C'est pas super clair dans la norme, mais à la lecture de la section 5.5, je comprends ca comme ca : l'expression (obj.*ptr_func)(); avec ptr_fun du type void (T::*)() (par exemple), et obj un objet d'un type fille de T, alors c'est un appel de la fonction désigné par ptr_func (fonction membre de la class T), sur l'objet désigné par obj, dont le type statique dans cette expression est T.

    Par contre je doute qu'il soit possible de "qualifié" un tel appel pour couper la virtualité.

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    199
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 199
    Par défaut
    D'accord, merci pour vos réponses à tous.

    Je pense donc au regard de tous çà que tel comportement ne peut donc être obtenue, ce qui va éliminer un cas à gérer au final.

    Bon week-end!

  7. #7
    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
    Bonjour,
    Tutoriels les fonctions virtuelles : XXIII-F. Qu'est-ce qu'un pointeur de fonction virtuelle ?

    Quand à la problématique d'avoir un pointeur sur la fonction de la classe de base et non celle de la classe dérivée : on dira jamais assez à quel point le pattern NVI est ton ami dès que tu fais des fonctions virtuelles.

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

Discussions similaires

  1. opengl et pointeur de fonction
    Par Oldhar dans le forum C
    Réponses: 5
    Dernier message: 06/11/2003, 23h56
  2. Declaration de fonction retournant un pointeur sur fonction
    Par pseudokifaitladifférence dans le forum C
    Réponses: 5
    Dernier message: 11/08/2003, 19h37
  3. Matrice de pointeurs de fonctions
    Par sebduth dans le forum C
    Réponses: 15
    Dernier message: 18/07/2003, 14h03
  4. [Kylix] Pointeur de fonctions
    Par _dack_ dans le forum EDI
    Réponses: 1
    Dernier message: 03/07/2003, 10h17
  5. pointeur de fonction
    Par kardath dans le forum C
    Réponses: 4
    Dernier message: 28/12/2002, 14h39

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