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 :

cast et heritage


Sujet :

C++

  1. #1
    Membre confirmé Avatar de BigNic
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    195
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2004
    Messages : 195
    Par défaut cast et heritage
    soit une classe A et une classe B où B dérive de A.
    soit le code suivant ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    B *b = new B;
    A *a = b;
    B *X = static_cast<B*> a;
    Porquoi ce code fonctionne ? Plus précisement pourquoi un static_cast suffit ?
    Comment un pointeur sur un A peut servire à initiliser un pointeur sur un B ?
    Que ce passe-t-il pour les attributs dans B qui sont en plus de ceux de A ? Comment sont-ils initialisés ?

    Je sais bien que google, la FAQ, soustrup est mon ami, mais est-que quelqu'un pourrait me gratifier d'un exemple pertinent qui me fasse comprendre pourquoi ça marche ?

  2. #2
    Membre Expert
    Avatar de hiko-seijuro
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    2 011
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 011

  3. #3
    Membre confirmé Avatar de BigNic
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    195
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2004
    Messages : 195
    Par défaut
    je vais faire mon lourd mais, je ne comprend pas ta réponse
    Car dans la poste auquel tu fais référence on parle de caster une classe fille vers une classe mère. De polymorphisme quoi ! Or ça je comprend et pratique. Mais ce qui m'interesse c'est le contraire, du down cast quoi ! Les exemples de la faq utilise un dynamic cast pour faire ça. Avec le dynamic cast je conmprend comment cela marche, car tu fais appel au RTTI, donc tu sais que ton pointeur de classe mère pointe en fait sur une classe fille, mais avec un static cast comment cela peut marcher ? c'est ça que je ne comprend pas ?

  4. #4
    Membre Expert
    Avatar de hiko-seijuro
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    2 011
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 011
    Par défaut
    scuse j'avais mal compris la deuxième question :s donc ai rien dit :d

  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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    A *a = b;
    B *X = static_cast<B*> a;
    Ici, a est un B* mais caché(cf le lien ci dessus)... C'est à dire que c'est un B* mais comme il est A* à ce moment là, on ne peut se servir que des fonctions/membres qu'il a en commun avec A.
    Pour le static_cast, il me semblait que le dynamic_cast seulement pouvoir faire du downcasting... Mais étant donné que a est en fait un B* "caché", et non pas un A*, le static_cast doit marcher... Mais j'ai plutot vu dynamic cast auparavant.

  6. #6
    Membre Expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Par défaut
    C'est le compilo qui doit être super efficace!

  7. #7
    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
    Pour le downcasting :
    - Dynamic_cast = Je suis pas certain que mon doncasting soit valide, si ce n'est pas le cas, gentil compilateur, dit le moi à l'exécution.
    - Static_cast = Je sais ce que je fais, et je suis certain que le pointeur que je downcast pointe bien sur un objet de ce type de classe dérivée. Pas la peine de perdre du temps à vérifier quoi que ce soit, fais moi confiance.

    Il y a des gens qui, par l'intermédiaire d'une macro, quand ils pensent se trouver dans le cas 2, où ils savent ce qu'ils font, utilisent quand même un dynamic_cast en mode debug, afin de détecter plus facilement les erreurs de
    codage, mais passent en static_cast en mode release, pour avoir les perfs maximales.
    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.

  8. #8
    Membre Expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Par défaut
    gentil compilateur, dit le moi à l'exécution.
    A la compilation plutôt.

  9. #9
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 287
    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 287
    Par défaut
    Non. Loic voulait bien dire "exécution".
    Accessoirement, dans mes souvenirs, le static_cast n'est plus valable de la sorte avec de l'héritage multiple. Ou alors n'est-ce que pour les cross-casting où il ne peut être utilisé ? D'un coup j'ai doute.
    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...

  10. #10
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Par défaut
    Il me semble que dynamic_cast c'est la même chose que static_cast sauf qu'il effectue une vérification à l'execution.

  11. #11
    Membre confirmé Avatar de BigNic
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    195
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2004
    Messages : 195
    Par défaut
    merci de vos réponses, je pensais que le dynamic cast était obligatoire. Mais en fait non alors. En même temps je trouve la pratique dangereuse.

  12. #12
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Par défaut
    C'est dangereux si tu n'es pas sûr que a est en fait un B*.
    dynamic_cast fournira NULL dans le cas où s'en est pas un, alors que static_cast aura un comportement indéfini.

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

Discussions similaires

  1. cast et heritage
    Par totoche dans le forum Débuter avec Java
    Réponses: 7
    Dernier message: 08/04/2008, 19h17
  2. pb cast heritage
    Par DEVfan dans le forum C++
    Réponses: 9
    Dernier message: 14/03/2008, 10h50
  3. Heritage et cast
    Par LordBob dans le forum C++
    Réponses: 7
    Dernier message: 23/04/2007, 08h37
  4. [heritage] cast
    Par r0d dans le forum C++
    Réponses: 2
    Dernier message: 24/04/2006, 15h36

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