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 :

Dynamic_cast & Base class virtuelle


Sujet :

C++

Vue hybride

Message pr�c�dent Message pr�c�dent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Avril 2005
    Messages
    42
    D�tails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 42
    Par d�faut Dynamic_cast & Base class virtuelle
    Bonjour,
    En lisant la documentation MSDN a propos du dynamic_cast, je me suis arr�t� sur les quelques lignes traitant des classes bases virtuelles. Il y est dit que pour caster de A vers B (voir http://msdn.microsoft.com/library/de...t_operator.asp), on doit auparavant caster de A � E, et ensuite remonter (upcast) jusqu'a E. J'ai essaye, et ca ne fonctionne pas, voici mon code de test...

    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
     
    #include <iostream>
     
    using namespace std;
     
     
    class A { public: virtual ~A() { } };
     
    class B : virtual public A { };
     
    class C : virtual public B { };
     
    class D : virtual public B { };
     
    class E : virtual public C, virtual public D { };
     
     
    int main()
    {
    	E e;
     
    	A *pA = &e;
    	E *pE = dynamic_cast<E *>(pA);
     
     
    	return 0;
    }
    Vous savez d'ou cela peut prevenir ?
    Merci

  2. #2
    Expert �minent
    Avatar de M�dinoc
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 41
    Localisation : France

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par d�faut
    Je viens de tester sous Dev-C++, �a marche parfaitement!

    Le code fait l'upcast implicite de &E en A*, puis le downcast dynamique de A* vers E*, sans probl�me...

    Qu'est-ce qui ne marche pas chez toi?
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parl� avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    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
    a- Toutes tes classes sont partag�es -- ce qui ne correspond pas aux hi�rarchies montr�es dans la doc cit�e et donc aux probl�mes d'ambiguit�s � lever. Tu as cod�:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
      A
      |
      B
     / \
    C   D
     \ /
      E
    Redocumente-toi sur l'h�ritage virtuel et son implication dans l'h�ritage multiple.
    p.ex. en faisant sauter les h�ritages virtuels de C et D vers B, tu aurais eu deux B englobant tous deux le m�me A. L�, il y aurait pu y avoir des probl�mes d'ambiguit� � g�rer. Dans E, de quel B parle-t-on ? de celui int�gr� � C ? ou bien de celui int�gr� � D? Donc => passer par C ou D pour remonter � leur B non partag�.

    b- Je ne vois pas le rapport entre ta question et ce que tu as �cris dans ton main(). Ton code ne correspond pas � ce dont tu parles au dessus.
    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...

  4. #4
    Membre averti
    Inscrit en
    Avril 2005
    Messages
    42
    D�tails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 42
    Par d�faut
    a- Toutes tes classes sont partag�es -- ce qui ne correspond pas aux hi�rarchies montr�es dans la doc cit�e et donc aux probl�mes d'ambiguit�s � lever.
    Ha ok, je pense avoir compris...
    Dans mon code, j'ai utilis� uniquement des classes partag�es, c'est donc vrai qu'il n'y a pas de probl�mes d'ambigu�t� comme dans mon indiqu� dans le lien de la msdn... dsl

    Par contre, des probl�mes d'ambigu�t� peuvent intervenir dans ce code :

    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
     
    #include <iostream>
     
    using namespace std;
     
    class A
    {
    };
     
    class B : public A
    {
    };
     
    class C : public A
    {
    };
     
    class D : public B, public C
    {
    };
     
     
    int main()
    {
       D *d = new D;
     
    // A *a = d;   // upcast  --> Ambigous
     
       C *c = d;   // on upcast par C
       A *a = c;   // .. et finalement upcast vers A  --> pas ambigous
     
       return 0;
    }
    M�dinoc >> Merci pour ton essai, chez moi �a compile mais le programme plante...

    Luc >> Comment tu illustrerais le sch�ma de Class Hierarchy Showing Virtual Base Classes alors ?

    Merci pour vos r�ponses.

  5. #5
    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
    Citation Envoy� par taron
    Luc >> Comment tu illustrerais le sch�ma de Class Hierarchy Showing Virtual Base Classes alors ? pas comme je l'ai fait ?
    Exactement comme je te l'avais dit. Je peux me tromper, mais je vois �a ainsi:
    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
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    // illustration de "Class Hierarchy Showing Virtual Base Classes"
    //
    //    A
    //   / \
    //  B   B
    //  |   |
    //  C   D
    //   \ /
    //    E
    //
     
    #include <iostream>
    #include <cassert>
     
    struct A {
        A(int a) : a_(a) {}
     
        // ctr par défaut avec assertion pour forcer à appeler A(int) 
        // depuis les classes finales
        A() { assert(false && "Wrong compilation path"); }
     
        virtual ~A() {}
        void print_a() const { std::cout << "a="<<a_ << std::endl;}
    private:
        int a_;
    };
     
    struct B : virtual A {
        B(int b) : b_(b) {}
        virtual ~B() {}
        void print_b() const { std::cout << "b="<<b_ << std::endl;}
    private:
        int b_;
    };
     
    struct C : B {
        C(int bc, int c) : B(bc), c_(c) {}
        virtual ~C() {}
        void print_c() const { std::cout << "c="<<c_ << std::endl;}
    private:
        int c_;
    };
     
    struct D : B {
        D(int bd, int d) : B(bd), d_(d) {}
        virtual ~D() {}
        void print_d() const { std::cout << "d="<<d_ << std::endl;}
    private:
        int d_;
    };
     
    struct E : C, D {
        E(int a, int bc, int bd, int c, int d, int e) 
    	: A(a), C(bc, c), D(bd, d), e_(e) {}
        virtual ~E() {}
        void print_e() const { std::cout << "e="<<e_ << std::endl;}
    private:
        int e_;
    };
     
     
    int main()
    {
        E e(1,2,3,4,5,6);
     
        std::cout << "Depuis E:\n";
        e.print_e();
        e.print_d();
        e.print_c();
        // e.print_b(); // ambigüe
        e.print_a();
     
        std::cout << "Depuis D:\n";
        D * d = &e;
        d -> print_d();
        // d -> print_c(); // evidemment pas accessible
        d -> print_b();
        d -> print_a();
     
        std::cout << "Depuis C:\n";
        C * c = &e;
        // c -> print_d(); // evidemment pas accessible
        c -> print_c();
        c -> print_b();
        c -> print_a();
     
        // B * b = &e; // ambigüe
        std::cout << "Depuis B via C:\n";
        B * bc = c;
        bc -> print_b();
        bc -> print_a();
     
        std::cout << "Depuis B via D:\n";
        B * bd = d;
        bd -> print_b();
        bd -> print_a();
    }
    Si je me souviens bien, dans les articles aggr�g�s sur le developer-pipeline (lien accessible depuis le site de http://www.cuj.com), il y avait un article tentant de d�mystifier l'h�ritage multiple.
    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...

  6. #6
    Membre averti
    Inscrit en
    Avril 2005
    Messages
    42
    D�tails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 42
    Par d�faut
    Yeah, merci beaucoup :-)

Discussions similaires

  1. R�ponses: 8
    Dernier message: 16/10/2006, 12h28
  2. Classe virtuelle detructeur virtuel
    Par Jeane dans le forum C++
    R�ponses: 3
    Dernier message: 26/06/2006, 23h06
  3. R�ponses: 2
    Dernier message: 01/02/2006, 15h02
  4. directshow bases classes
    Par moldavi dans le forum DirectX
    R�ponses: 3
    Dernier message: 30/03/2005, 21h59

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