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 :

Downcasting


Sujet :

C++

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    127
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2003
    Messages : 127
    Points : 124
    Points
    124
    Par défaut Downcasting
    Bonjour!

    Je suis toujours en train de préparer mon exam de C++.
    Dans une question ou je dois décrire l'upcasting et downcasting, la sous-question suivante est posée :
    "Pourquoi le downcasting est-il souvent utilisé dans le cas de l'utilisation d'une librairie C++?"
    Quelqu'un pourrait-il m'éclairer svp?
    Merci d'avance!
    Mon blog sur Ruby on Rails : 2dconcept

  2. #2
    Expert éminent sénior

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

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 751
    Points : 10 670
    Points
    10 670
    Billets dans le blog
    3
    Par défaut
    En ce qui me concerne je l'utilise rarement. L'exemple que j'ai en tête c'est dans les toolkit graphiques avec un tree control, quand tu dois filer un TreeItem* (par exemple), et que toi tu veux les différencier. L'exemple type c'est une arborescence de répertoires, tu veux distinguer les répertoires des fichiers. Toi tu as défini TreeItemFile et TreeItemDir, mais tu n'as pas le choix car le controle n'accepte que des TreeItem.
    Alors tu lui files des TreeItemFile et TreeItemDir qu'il manipule comme des TreeItem, et plus tard tu tests / downcast chaque TreeItem pour savoir si c'est un File ou un Dir via des dynamic_cast ou autre.
    Pour généraliser, je dirais que c'est quand cette "librairie" (on dit bibliothèque en français) impose une interface qui ne te satisfait pas et que tu souhaites dériver. Difficile à expliquer...
    A mois que la question sous-entende une horreur genre caster des void*...

  3. #3
    Membre à l'essai
    Inscrit en
    Janvier 2005
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 17
    Points : 20
    Points
    20
    Par défaut
    ahhh ! le castage des void* ! les souvenirs
    Pour ton exemple d'abre, c'est plutot un exemple de polymorphisme non ?

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2003
    Messages : 29
    Points : 24
    Points
    24
    Par défaut
    upcasting et downcasting c'est l'action de transtyper respectivement vers une classe mere ou vers une classe fille.

    On downcaste souvent si on a une interface. Si tu as des classes rectangle, triangle, cercle qui derivent de forme et que tu veux les stocker dans un vector, tu fais un vector de pointeur vers le type forme puis tu pourras lui associer ce que tu veux comme sous-classe et downcaster (avec static_cast ou dynamic_cast) pour l'utiliser convenablement.

    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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
     
    #include <iostream>
    using namespace std;
     
    class forme {
      public:
    	  forme() {}
    	  virtual void draw () {}
              virtual ~draw () {}
    };
     
    class rectangle : public forme {
      public:
    	  rectangle () : forme() {}
    	  void draw () { cout << "bla" << endl; }
    };
     
    class triangle : public forme {
      public: 
    	  triangle () : forme() {}
    	  void draw () { cout << "beuh" << endl; }
    };
     
    int main () {
      forme* p = new rectangle;
      rectangle* pt = static_cast<rectangle*> (p);
      pt->draw();
      delete p;
      p = new triangle;
      triangle *pt1 = static_cast<triangle*> (p);
      pt->draw();
      delete p;
      system("pause");
      return 0;
    }
    enfin, un truc du genre.

  5. #5
    Membre averti
    Homme Profil pro
    Inscrit en
    Avril 2002
    Messages
    290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2002
    Messages : 290
    Points : 325
    Points
    325
    Par défaut
    typiquement tu retrouve en situation de downcaster quand :
    -tu utilises un stockage polymorphique, cas du Tree graphique evoqué plus haut, quand tu prends un element tu obtiens forcement un element du type de base... C'est souvent le cas quand tu dois deriver un type de base fourni par une lib qui fourni elle-meme un moyen de stockage des instances...

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

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Autre situation : lorsque tu écris des plugins pour une application. L'application ne connait que la classe de base, mais toi dans ta DLL tu en manipules une dérivée. Donc typiquement lorsque ta DLL va te transmettre un pointeur sur classe de base toi tu vas downcaster pour avoir un pointeur sur ta classe dérivée.

    Exemple : un moteur 3D manipule des Texture*. Toi tu écris un système de rendu basé sur OpenGL -> tu vas caster les Texture* reçues en TextureOpenGL*. Et dans le module DirectX tu vas les caster en TextureDirectX* par exemple.

  7. #7
    Expert éminent sénior

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

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 751
    Points : 10 670
    Points
    10 670
    Billets dans le blog
    3
    Par défaut
    Ce qui me gêne dans sa question c'est le "souvent". J'ai tendance à considérer le downcasting comme un mauvais design, surtout en C++. En général avec les fonctions virtuelles tu t'en sors bien.

  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 : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Citation Envoyé par Aurelien.Regat-Barrel
    Ce qui me gêne dans sa question c'est le "souvent". J'ai tendance à considérer le downcasting comme un mauvais design, surtout en C++. En général avec les fonctions virtuelles tu t'en sors bien.
    +1.
    Ne pas oublier que ce genre de situation reste rare et que bien souvent le downcasting peut être avantageusement évité.

  9. #9
    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 : 49
    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
    Points : 16 213
    Points
    16 213
    Par défaut Re: Downcasting
    Citation Envoyé par Mookie
    "Pourquoi le downcasting est-il souvent utilisé dans le cas de l'utilisation d'une librairie C++?"
    Parce qu'il existe en C++ des bibliothèques mal conçues ?

    A la limite, la question aurait été la même en Java en non en C++, j'aurais pu faire une réponse plus pertinente ("Parce que le manque de template rend ça obligatoire"), même si ça évolue un peu.

    Mais vraiment, en C++, je vois pas...
    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.

  10. #10
    Expert éminent sénior

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

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 751
    Points : 10 670
    Points
    10 670
    Billets dans le blog
    3
    Par défaut
    Si si, y'a le void*....

  11. #11
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    127
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2003
    Messages : 127
    Points : 124
    Points
    124
    Par défaut
    Merci à tous pour vos réponses.
    Je viens de trouver ceci dans mon syllabus :
    Cet opérateur (dynamic_cast) est une bonne illustration de ce que l'on appelle le RTTI (Run-Time Type Information) proposé par les compilateurs C++ actuels. Ce service permet d'obtenir des informations sur le type dynamique des objets pointés contenant des méthodes virtuelles (on parle dans ce cas d'objets polymorphes).
    Pensez-vous que ça pourrait répondre à ma question? Je trouve que ça parle plutôt du compilateur et de dynamic_cast plutôt que des librairies et du downcast mais bon...
    Mon blog sur Ruby on Rails : 2dconcept

  12. #12
    Membre averti
    Homme Profil pro
    Inscrit en
    Avril 2002
    Messages
    290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2002
    Messages : 290
    Points : 325
    Points
    325
    Par défaut
    dynamic_cast est l'operateur qui permet de faire du downcasting, c'est le moyen pas la raison. On fait du downcasting quand on se trouve avec un objet dont on sait qu'il est d'un type plus evolué quer le type de base.

    L'idée qu'un lib serait mal concu par ce qu'elle impose du downcasting me semble un peu simpliste: les template ne resolvent pas tout ce que résoud le polymorphisme, et de plus il impose que le code soit disponible dans les headers (tant que les compilos ne gereont pas le export) ce qui peut-etre inacceptable.

  13. #13
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 275
    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 275
    Points : 10 985
    Points
    10 985
    Par défaut
    Le rapport entre Templates et Downcasting correspond à l'alternative (bonne à mon avis) aux objets racines de toutes choses qui sont utilisés comme pierres angulaires aux collections. Grâce à cela, une bonne part de downcasting inutile est réglé en C++. Ils agissent comme un bon sucre syntaxique, et ne corrigent pas vraiment les erreurs de design qui n'ont pas de rapport au fond.

    Une lib qui va demander (ou réaliser) à downcaster alors qu'un design mieux réfléchi aurait permi de se reposer sur le polymorphisme d'héritage ... ben je ne trouve pas ça terrible. Les templates ne résolvent rien ; il se limitent essentiellement (relativement au downcasting) à un sucrage syntaxique pour mettre en oeuvre des collections et autres types abstraits.

    Des exemples typiques où le downcasting est nécessaire ? Comme l'a dit Loulou, assez rapidement avec des plugins ; surtout quand on doit les présenter les uns aux autres, avant qu'ils ne se mettent à coopérer de façon privilégiée. Je pense aussi au multi-dispatching, pour lequel je n'ai pas croisé de solution C++ n'usant pas du downcasting.

    Dans tous les cas, la nécessité du downcasting reste ponctuelle. Quand on démarre (en C++, POO, ...) , 95% du temps on pourrait s'y prendre autrement.

    Et +42 à
    Citation Envoyé par Gandalf
    dynamic_cast [...] c'est le moyen pas la raison
    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...

  14. #14
    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 : 49
    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
    Points : 16 213
    Points
    16 213
    Par défaut
    Pour ce genre de choses, export ne servira pas à grand'chose, puisqu'il n'évite pas que l'on doive aussi livrer le code source.

    Pour ce qui est de protèger du code, je préfère un bon contrat et un bon juriste qu'un système qui camoufle légèrement le code. En général, quand j'achète une bibliothèque, c'est avec son code source.

    Et, pour continuer dans la légère caricature, une classe de conteneur réalisée sans template aura en effet peu de risque d'être utilisée illégalement. Elle aura même peu de risque d'être utilisée tout court...
    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.

  15. #15
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 275
    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 275
    Points : 10 985
    Points
    10 985
    Par défaut
    <troll> Pourtant la VCL résiste et ne veut pas disparaitre -- comprendre ses utilisateurs qui ne veulent pas l'abandonner</>
    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...

  16. #16
    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 : 49
    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
    Points : 16 213
    Points
    16 213
    Par défaut
    <Troll> De toute façon, même si ses utilisateurs continuent avec, ce sont ses développeurs qui vont l'abandonner... </Troll>
    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.

  17. #17
    Expert éminent sénior

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

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 751
    Points : 10 670
    Points
    10 670
    Billets dans le blog
    3
    Par défaut
    Citation Envoyé par JolyLoic
    <Troll> De toute façon, même si ses utilisateurs continuent avec, ce sont ses développeurs qui vont l'abandonner... </Troll>
    c'est déjà fait... J'y connais pas grand chose, mais il me semble que la VCL a pour excuse d'être développée en Pascal et plus ou moins bindée en C++. Faire des templates en Pascal...

  18. #18
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 68
    Points : 52
    Points
    52
    Par défaut
    Citation Envoyé par Luc Hermitte
    Je pense aussi au multi-dispatching, pour lequel je n'ai pas croisé de solution C++ n'usant pas du downcasting.
    Lorsque tu parles de multi-dispatch, tu parle du double dispatch, la spécialisation du design pattern Visitor ? Dans ce cas ce que tu dis m'étonne un peu car ces 2 principes permettent justement d'éviter bien des débordements du style downcast et test de type...

    Typiquement pour un arbre, dont il a été beaucoup question, des comportements spécifiques aux types des noeuds traités pourront être obtenus de façon élégante, sûre et sans downcast grâce au pattern Visitor... Maintenant il est vrai que cela reste surtout possible lorsque le designer de l'arbre des visités est le même que celui de la hiérarchie de visiteurs, car il y a un fort couplage. Dans le cas d'une API, je ne sais pas si ça serait applicable.

    Pour ma part l'exemple le plus courant que je connaisse d'API obligeant au downcast sont les API XML (Xerces et la couche client Oracle en font partie).

  19. #19
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 275
    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 275
    Points : 10 985
    Points
    10 985
    Par défaut
    Oui, le double c'est ça.
    Faut dire aussi que je n'avais pas énormément cherché et que je m'étais arrété aux implémentations de Loki (Modern C++ Design) qui m'avaient parues tenir la route.
    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...

Discussions similaires

  1. Downcasting ou copie a travers un heritage ?
    Par enrikomic dans le forum Langage
    Réponses: 7
    Dernier message: 29/06/2007, 17h17
  2. Réponses: 13
    Dernier message: 02/03/2007, 14h43
  3. Downcasting et type
    Par Alfred12 dans le forum C++
    Réponses: 7
    Dernier message: 28/02/2007, 08h57
  4. Pb de downcasting
    Par olive_le_malin dans le forum C++
    Réponses: 11
    Dernier message: 09/02/2007, 09h57
  5. [downcasting] fonction d'une classe fille
    Par poukill dans le forum C++
    Réponses: 7
    Dernier message: 28/07/2006, 16h26

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