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] Downcasting et méthodes virtuelles


Sujet :

C++

  1. #1
    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 [Héritage] Downcasting et méthodes virtuelles
    Salut à tous!

    Une petite question simple:

    Soit une classe A définissant "une interface":
    Soit B une classe fille de A, avec en plus une méthode spécialisée, n'exstant pas dans A:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    class A
    {
      foo();
    };
     
    class B : public A
    {
      foo2();
    };
    main.cpp:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    int main()
    {
      A * a;
      a->foo2(); // Impossible ?
    }
    Le downcasting n'est pas implicite ?
    Sachant qu'on est sur d'avoir affaire à un objet B? J'ai essayé avec un dynamic_cast, mais le compilo veut rien savoir !

    EDIT : Résolu avec:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    int main()
    {
      A * a;
      dynamic_cast<B>(a)->foo2();
    }

  2. #2
    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 : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Sachant qu'on est sur d'avoir affaire à un objet B?
    Vraiment ? Dans l'exemple que tu donnes je ne sais pas comment tu fais pour savoir que a est un B.
    Le downcasting n'est jamais implicite, puisque le compilo n'a aucun moyen de connaître le type dynamique de l'objet. Ca ne s'appelle pas "type dynamique" pour rien

    J'ai essayé avec un dynamic_cast, mais le compilo veut rien savoir !
    Montre nous ton code. Il y a aussi des exemples dans la FAQ, au cas où.

  3. #3
    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
    Oui Laurent, l'exemple n'était que pour montrer... Devant la complexité du programme, j'ai cracké!

    En fait, dans une classe je suis sur d'avoir affaire à un type B, et donc un dynamic_cast est obligatoire pour pouvoir utiliser ces méthodes...

    Merci et désolé pour le dérangement inutile...

    PS : il est temps que ce projet se termine !

  4. #4
    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 : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    En fait, dans une classe je suis sur d'avoir affaire à un type B, et donc un dynamic_cast est obligatoire pour pouvoir utiliser ces méthodes...
    En fait dynamic_cast n'est utile que pour t'assurer que le type dynamique est bon (renvoie NULL ou lève une exception si ce n'est pas le cas). Mais si tu es certain que c'est un B, un static_cast suffira et t'épargera la perte de performance dûe à dynamic_cast.

    Ou encore mieux : boost.polymorphic_cast, qui utilise dynamic_cast en debug et static_cast en release.

  5. #5
    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
    Merci !
    J'adopte static_cast !

  6. #6
    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
    Si tu es sur d'avoir un B*, et que ca ne peut en être autrement, utilise un B*.
    Mais bon, static_cast est ici le mieux.

  7. #7
    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
    Citation Envoyé par Alp
    Si tu es sur d'avoir un B*, et que ca ne peut en être autrement, utilise un B*.
    Mais bon, static_cast est ici le mieux.
    Bien sûr, mais c'est plus compliqué que ça...
    J'ai une classe Gen:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    class Gen
    {
    public:
       virtual method() { m_mat->foo(); }
     
    protected:
       A *m_mat;
    }
    Et j'ai plusieurs dérivées à la classe Gen : Gen1, Gen2, Gen3...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    class Gen3 : public Gen
    {
    public:
      virtual method() { m_mat->foo2(); } //un peu différent ici
    }
    ici la classe Gen3 n'utilise que B, c'est comme ça !
    Je ne pense pas qu'il y aie d'autre moyen que faire un static_cast<B*> ?

  8. #8
    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 : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Je ne pense pas qu'il y aie d'autre moyen que faire un static_cast<B*> ?
    Dans ce cas non, effectivement.

  9. #9
    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
    C'est bien ce que je pensais, merci !

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 26/10/2010, 11h33
  2. héritage et méthode virtuelle
    Par cibatro dans le forum Langage
    Réponses: 11
    Dernier message: 28/07/2009, 17h13
  3. méthode virtuelle pure et héritage
    Par Invité dans le forum Langage
    Réponses: 3
    Dernier message: 20/07/2009, 22h12
  4. héritage et méthodes virtuelles ?
    Par Didine981 dans le forum C++
    Réponses: 4
    Dernier message: 08/12/2007, 13h43
  5. Exceptions, héritage et méthodes virtuelles
    Par Nuwanda dans le forum C++
    Réponses: 13
    Dernier message: 23/05/2006, 12h06

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