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 :

Precisions sur le dynamic_cast de la FAQ


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert
    Avatar de Klaim
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2004
    Messages
    1 717
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 717
    Par défaut Precisions sur le dynamic_cast de la FAQ
    Bonjour!

    Je n'ai jusqu'ici jamais utilisé de dynamic_cast , apparemment parceque jusqu'ici j'ai assez bien conçu mes hierarchies de classes pour que cela soit inutile ...
    Mais comme je sais que par exemple le dynamic_cast est utilisé par beaucoup de gens apparemment, je me demandais exactement en quoi cela consistait et j'ai donc jetté un oeil à la FAQ.

    J'aurais besoin d'une précision sur ce point en particulier :

    Citation Envoyé par Loulou24
    Le downcasting est donc à utiliser avec parcimonie, lorsque l'on n'a pas le choix ou que l'on sait exactement ce que l'on fait. Par exemple dans le cas des plugin, ou encore lorsque l'on travaille avec un code, une bibliothèque ou une API qui ne connaîtrait (et donc ne pourrait manipuler) que la classe de base d'une hiérarchie. Les classes dérivées étant écrites par le client, le downcasting est donc une solution simple pour communiquer avec la bibliothèque en question.
    A ce que je comprends, comme je le pensais, il est inutile de faire du downcasting quand la hierarchie des classes est bien organisée et que la fonctio dans laquelle on se trouve est soit spécialisée pour une classe de cette hierarchie et ses héritières, soit pour une classe virtuelle et donc pour toutes ses héritières.
    En lisant ce texte je comprends bien qu'il y a un(?) cas lorsqu'on utilise une lib exterieure où on a besoin du dynamic_cast, mais je ne vois pas bien exactement dans quel(s?) cas exactement.

    Est-ce que quelqu'un pourrais me donner un exemple svp?

    Merci de votre attention!

  2. #2
    Membre chevronné
    Avatar de bigquick
    Profil pro
    Inscrit en
    Août 2002
    Messages
    356
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 356
    Par défaut
    Bonjour !

    Voilà un petit exemple, completement fictif, pour essayer d'illustrer le problème de la lib:

    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
    // ----- code de la bibliothèque tierce -----
    namespace WindowManager
    {
    	class Window  {};
     
    	void	 AddWindow( Window* );
    	Window*  GetFirstWindow();
    }
     
     
     
    // ----- notre code (coté client) -----
    class MyWindow : public WindowManager::Window
    {
    	// code specifique, qui redéfinit certaines fonctions
    };
     
     
     
    void main()
    {
    	MyWindow a;
     
    	WindowManager::AddWindow( &a );
     
    	// on est sur que ca sera un MyWindow
    	// mais la lib n'est pas capable de nous retourner autre chose que des Window
     
    	// on va dire que GetFirstWindow() retourne un pointeur valide
    	MyWindow* p = dynamic_cast<MyWindow*>( WindowManager::GetFirstWindow() );
     
    	// il  n'y a aucune raison pour que le dynamic_cast ait échoué (donc retourné NULL) puisqu'on *sait* que la fenêtre est de ce type la.
    }
    Voilà, j'espère que ce petit exemple était assez parlant
    Mais en effet, d'après moi, dynamic_cast n'est à utiliser qu'en cas de (réél) besoin, et pas pour se passer d'une bonne conception, en l'utilisant pour remplacer le polymorphisme - un peu comme le instanceof de java...

  3. #3
    Membre Expert
    Avatar de Klaim
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2004
    Messages
    1 717
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 717
    Par défaut
    Haaaaaa ok je vois!

    Donc ce serait surtout dans le cas où on fouris un objet d'une classe héritant de la classe de base que connait la lib externe et quand on la récupère on doit pouvoir retrouver la classe héritée qu'on avait déclarée...

    Merci pour cet exemple je comprends mieux!

  4. #4
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 296
    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 296
    Par défaut
    Des exemples classiques où ce n'est pas contournable, rapidement:
    - en sortie de factory et autres systèmes de pugins
    - en sortie de désérialisation
    - pour faire du multi-dispatch (en gros, fonctions virtuelles selon plusieurs arguments)
    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...

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

Discussions similaires

  1. précisions sur glutPostRedisplay()
    Par khayyam90 dans le forum GLUT
    Réponses: 4
    Dernier message: 29/07/2004, 10h03
  2. Precision sur l'encodage de caractere
    Par La Truffe dans le forum Format d'échange (XML, JSON...)
    Réponses: 4
    Dernier message: 19/05/2004, 13h52
  3. besoin de precision sur gluLookAt!
    Par bakonu dans le forum OpenGL
    Réponses: 3
    Dernier message: 25/04/2004, 19h05
  4. precision sur le pilotage du port parallele
    Par fransouik dans le forum C++Builder
    Réponses: 18
    Dernier message: 26/02/2004, 13h28
  5. [VBA-E]Demande de précision sur les menus
    Par geffdenimes dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 25/06/2003, 10h46

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