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 :

polymorphisme et autre


Sujet :

C++

Vue hybride

Message pr�c�dent Message pr�c�dent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    F�vrier 2005
    Messages
    3
    D�tails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : F�vrier 2005
    Messages : 3
    Par d�faut polymorphisme et autre
    Bonjour � tous, j'ai un probl�me concernant le polymorphisme. Je vais essay� de simplifi� le prob en vous donnant un simili code, qui est le suivant:

    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
    class A {
     
     virtual A:: methodeVirt(){
              ...
            }
     
     A::methodeA(){
            A monobjetA;
            ...
            monobjetA.methodeVirt();
            ...
            }
    }
     
     
    class B : public A {
     
    B:: methodeVirt(){
                 ...
             }
    }

    Mon probl�me est que lors de l'appel de la m�thode A::methodeA(), l'objet "monobjetA" peut en fait �tre un objet de classe B (c'est possible gr�ce au code en "..."), et de ce fait, j'aimerais que ce soit la methodeVirt() de la classe B qui soit appelee dans ce cas. Or actuellement, syst�matiquement c'est la methodeVirt() de la classe A qui est appel�e.

    Comment r�soudre un tel probl�me? : ... Merci d'avance...


    [Balises CODE rajout�es par Loulou24, merci d'y penser � l'avenir]

  2. #2
    Membre confirm�
    Inscrit en
    Avril 2002
    Messages
    180
    D�tails du profil
    Informations forums :
    Inscription : Avril 2002
    Messages : 180
    Par d�faut
    si j'ai bien comprie ta question
    prenon ce bout de 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
    34
    35
    36
    37
    38
     
    class A
    {
    public:
    	A(){cout<<"construeut A\n";}
    	~A(){cout<<"Destructeur A\n";}
     
    virtual Me(){cout<<"Class A\n";}
    };
     
    class B : public A
    {
    	public:
    	B(){cout<<"construeut B\n";}
    	~B(){cout<<"Destructeur B\n";}
     
    virtual Me(){cout<<"Class B\n";}
    };
     
    int main(int argc, char* argv[])
    {
    		A* a;
    		B* b;
    		A* ab;
    		cout<<"************************\n A* a=new A()\n";
    		a=new A();
    		a->Me();
     
    		cout<<"************************\n B* b=new B()\n";
    		b=new B();
    		b->Me();
     
    		cout<<"************************\n A* ab=new A()\n";
    		ab=new B();
    		ab->Me();
     
    	return 0;
    }

    A* ab=new B();
    initialise un object A avec le visage de B ainse l'apelle
    de ab->Me() aura comme sorti Classe B

  3. #3
    Membre �clair�
    Homme Profil pro
    Ing�nieur d�veloppement logiciels
    Inscrit en
    D�cembre 2004
    Messages
    47
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activit� : Ing�nieur d�veloppement logiciels
    Secteur : High Tech - �lectronique et micro-�lectronique

    Informations forums :
    Inscription : D�cembre 2004
    Messages : 47
    Par d�faut
    l'objet "monobjetA" peut en fait �tre un objet de classe B (c'est possible gr�ce au code en "...")
    Le polymorphisme ne s'applique que sur les objets aux bouts d'un pointeur ou d'une r�f�rence. Donc si tu d�clares ton objet de cette fa�on :
    monobjetA sera toujours de type A et tu ne pourras pas utiliser le polymorphisme

  4. #4
    Membre �clair�
    Homme Profil pro
    Ing�nieur d�veloppement logiciels
    Inscrit en
    D�cembre 2004
    Messages
    47
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activit� : Ing�nieur d�veloppement logiciels
    Secteur : High Tech - �lectronique et micro-�lectronique

    Informations forums :
    Inscription : D�cembre 2004
    Messages : 47
    Par d�faut
    Citation Envoy� par philippe V
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    class A
    {
    public:
    	A(){cout<<"construeut A\n";}
    	~A(){cout<<"Destructeur A\n";}
     
    virtual Me(){cout<<"Class A\n";}
    };
    Attention, une classe suceptible d'�tre d�riv� doit toujours d�clar� sont destructeur comme virtuelle (dans ce cas c'est pas gr�ve car il ne fait rien, mais c'est bon d'avoir de bonne habitude).

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    F�vrier 2005
    Messages
    3
    D�tails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : F�vrier 2005
    Messages : 3
    Par d�faut
    Il y a une chose qu'il ne faut pas oublier dans le probl�me que je d�cris, c'est que la m�thode qui pose probl�me (MethodeA()) se situe DANS les m�thodes de la classe m�re (classe A) , et ce n'est pas la m�me chose que si j'avais voulu faire ce genre de manip dans un "main".... D�j�, parce que la classe fille (classe B) n'est pas d�finie encore et n'est pas compl�te si je ne fais que rajouter un "class B;" en entete du fichier de la classe A.

    Je vais essay� de changer la d�claration de monobjetA pour un type A* plutot que A comme vous l'avez conseill�, mais j'ai un doute sur le fait que ce soit la solution.... Je vous tiens au courant d'ici quelques minutes!


  6. #6
    Candidat au Club
    Profil pro
    Inscrit en
    F�vrier 2005
    Messages
    3
    D�tails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : F�vrier 2005
    Messages : 3
    Par d�faut
    Je viens d'essayer en utilisant plutot un pointeur "A* monobjetA" .... Ca n'a rien chang�... l'appel de "MethodeVirt()" dans la MethodeA() appelle toujours celle de la classe A....


    Si vous avez d'autres id�es, je suis toute ou�e !!!

  7. #7
    Membre confirm�
    Inscrit en
    Avril 2002
    Messages
    180
    D�tails du profil
    Informations forums :
    Inscription : Avril 2002
    Messages : 180
    Par d�faut
    Citation Envoy� par "CroustRyu
    Attention, une classe suceptible d'�tre d�riv� doit toujours d�clar� sont destructeur comme virtuelle (dans ce cas c'est pas gr�ve car il ne fait rien, mais c'est bon d'avoir de bonne habitude).
    tout afait d'acord


    Mon probl�me est que lors de l'appel de la m�thode A::methodeA(), l'objet "monobjetA" peut en fait �tre un objet de classe B (c'est possible gr�ce au code en "..."), et de ce fait, j'aimerais que ce soit la methodeVirt() de la classe B qui soit appelee dans ce cas. Or actuellement, syst�matiquement c'est la methodeVirt() de la classe A qui est appel�e.
    je ne suis pas sure de comprendre
    ca sera les methode de B qui seront appeler
    evideament l'object doit etre construit
    comment initialise-tu ton pointeur A ?????

  8. #8
    Membre �clair�
    Inscrit en
    F�vrier 2005
    Messages
    53
    D�tails du profil
    Informations forums :
    Inscription : F�vrier 2005
    Messages : 53
    Par d�faut
    Je pense que ce n'est pas possible car tu d�finis express�ment monobjetA de type A donc la m�thode de l'objet A est appel�e. Si tu veux d�clarer un objet de type B dans une m�thode de A, il fait que tu d�clares la classe B avant la m�thode susnom�e.

  9. #9
    Membre �clair� Avatar de Higestromm
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    516
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 516
    Par d�faut
    Le polymorphisme ne s'applique que sur les objets aux bouts d'un pointeur ou d'une r�f�rence.
    Ah bon ? Je pensais que l'on ne pouvais appliquer le polymorphisme qu'a un pointeur ... je vais tester ca moi

  10. #10
    Membre confirm�
    Profil pro
    Inscrit en
    D�cembre 2004
    Messages
    134
    D�tails du profil
    Informations personnelles :
    �ge : 41
    Localisation : France

    Informations forums :
    Inscription : D�cembre 2004
    Messages : 134
    Par d�faut
    Salut !
    je r�veil un vieux sujet !


    Sinon j'ai un probl�me avec mes classes, et je pense que le polymorphisme est la cl�s ... seulement en c++ je le maitrise pas trop (et j'ai pas trop compris ce qu'est �crit dans la faq)

    en fait nous avons la classe QWidget ( librairie QT)
    j'ai ma classe MainWdg qui h�rite de QWidget
    et ma classe GraphWdg qui h�rite aussi de Qwidget

    ma classe MainWdg construit un grand nombre d'objet dont :
    l'objet suivant :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
     
    // dans MainWdg.h
    QWidget     * QWG_TabGraph;
     
    // dans MainWdg.cpp
    QWG_TabGraph     = new GraphWdw (TAB_Main,"Graphique");
    Donc mon objet QWG_TabGraph est un QWidget mais avec les m�thode et les objets de ma classe GraphWdw. jusque l� tout marche nikel.

    seulement quand je veux utiliser des m�thodes que j'ai redefinis dans GraphWdw, il me dit
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
     
    BRGraphWdw.h:60:7: warning: no newline at end of file
    BRMainWdw.cpp: In member function `void BRMainWdw::Xupdate()':
    BRMainWdw.cpp:160: error: 'class QWidget' has no member named 'initDraw'
    Donc je comprend bien, vu que mon objet est d�clar� comme un Qvidget, il ne les trouve pas, mais pourtant elles sont l�... vu que j'arrive � utilis� les constantes etc que j'ai d�fini dans cette classe...

    pour info, voil� comment j'ai appel� initDraw dans MainWdg.cpp :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
     
    if ( interface == INTERFACE_GRAPH ) QWG_TabGraph->initDraw();
    (INTERFACE_GRAPH est une constante d�clar� dans GraphWdg.h )


    bon bah voil� voil� ... j'esp�re avoir �t� clair si quelqu'un sait comment �a marche ou a un bon tuto
    Ah oui au fait : la question FINALE c'est : comment je m'y prend pour appeller ma fonction initDraw d�fini dans mon objet GraphWdg mais qui a �t� construit en tant que QWidget

    lol ... je risque d'embrouiller plus qu'autre chose donc je m'arrete...

  11. #11
    Expert confirm�
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (�le de France)

    Informations professionnelles :
    Activit� : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par d�faut
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
     ((GraphWdw*)QWG_TabGraph)->initDraw(); 
    ou
    reinterpret_cast<GraphWdw*>(QWG_TabGraph)->initDraw();
    permet de transtyper le pointeur QWG_TabGraph en un pointeur sur un GraphWdw.

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

    Informations professionnelles :
    Activit� : D�veloppeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par d�faut
    Ni l'un ni l'autre, pour le downcasting c'est dynamic_cast. Mais � utiliser avec pr�cautions et dans des cas tr�s pr�cis, chercher les diff�rents topics en parlant sur ce forum pour avoir plus de d�tails.

    A part �a, pourquoi ne pas d�clarer ton widget comme �tant un GraphWdw* tout simplement ?

  13. #13
    Expert confirm�
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (�le de France)

    Informations professionnelles :
    Activit� : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par d�faut
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    Ni l'un ni l'autre, pour le downcasting c'est dynamic_cast
    dynamic_cast ne peut pas marcher sauf si la classe de base poss�de des fonctions virtuelles. Si c'est le cas, je suis d'accord que dynamic_cast permet de v�rifier que l'objet point� est effectivement du bon type (d�riv�) et que c'est une s�curit�. (Personnellement c'est ce transtypage que je privil�gie). Sinon teste les transtypages propos�s (o� il n'y a aucune garantie sur la r�alit� du type), je crois qu'ils sont corrects
    A part �a, pourquoi ne pas d�clarer ton widget comme �tant un GraphWdw* tout simplement ?
    OK. C'est la vraie question!

  14. #14
    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 CroustRyu
    Attention, une classe suceptible d'�tre d�riv� doit toujours d�clar� sont destructeur comme virtuelle (dans ce cas c'est pas gr�ve car il ne fait rien, mais c'est bon d'avoir de bonne habitude).
    Non. La n�cessit� n'est vraie seulement si ses objets sont susceptibles d'�tre d�truits polymorphiquement.


    Pour reinterpret_cast, il y a aussi des cas o� il ne machera pas. Si les fonctions ne sont pas virtuelles et que l'on essaie de faire de genre d'horreurs, on a le choix entre :
    - erreur de design, on rajoute les virtual qui manquent
    - on encapsule dans des adaptateurs qui vont r�introduire (via d�l�gation) le polymorphisme d'h�ritage oubli� en chemin. -- cela me fait penser � boost.interface que j'ai crois� par hasard aujourd'hui ; c'est sur le wiki.
    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...

  15. #15
    Membre confirm�
    Profil pro
    Inscrit en
    D�cembre 2004
    Messages
    134
    D�tails du profil
    Informations personnelles :
    �ge : 41
    Localisation : France

    Informations forums :
    Inscription : D�cembre 2004
    Messages : 134
    Par d�faut
    A part �a, pourquoi ne pas d�clarer ton widget comme �tant un GraphWdw* tout simplement ?
    parceque :
    MainWidget est la classe qui d�finit ma fenetre principale, et � l'int�rieur de ce widget il y 'en a d'autre dont notament BRGraphWdg, mais la fonction QT qui int�gre ce widget � ma fenetre principal n�cessite que ce soit un QWidget .
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    // Dans le .h
       QTabWidget  * TAB_Main; 
       QWidget     * QWG_TabGraph;
       QWidget     * QWG_TabZoom;
     
    // Dans le .cpp
       TAB_Main         = new QTabWidget (this,"");
       QWG_TabGraph     = new BRGraphWdw (TAB_Main,"Graphique");
       QWG_TabZoom      = new BRGraphWdw (TAB_Main,"Zoom");
     
       TAB_Main         -> insertTab( QWG_TabGraph, QString("Mode Graphique") );
       TAB_Main         -> insertTab( QWG_TabZoom, QString("Fiche des entitées") );
    Je ne pense pas qu'on puisse faire autrement. Si je d�clare mes QWG_... en BRGraphWdw il va comprendre que ce sont des QWidget quand je ferais QTabWidget::insertTab ( QWidget * child, const QString & label, int index = -1 )
    ?


    Sinon teste les transtypages propos�s (o� il n'y a aucune garantie sur la r�alit� du type)
    OK. merci encore ^^ ... �a a l'air ed marcher.

    j'ai fait
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    ((BRGraphWdw*) QWG_TabGraph )->initDraw();
    Merci de votre aide.

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

    Informations professionnelles :
    Activit� : D�veloppeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par d�faut
    La conversion Derivee* -> Mere* est possible et se fait implicitement. Donc bien s�r que tu peux d�clarer tes pointeurs avec leur type r�el

Discussions similaires

  1. Polymorphisme ou transtypage ou autres?
    Par totoche dans le forum Langage
    R�ponses: 2
    Dernier message: 01/11/2007, 12h17
  2. [langage] Comparer Perl avec d'autres langages comme C ?
    Par Anonymous dans le forum Langage
    R�ponses: 3
    Dernier message: 10/08/2002, 23h52
  3. R�ponses: 2
    Dernier message: 10/07/2002, 11h51
  4. R�ponses: 2
    Dernier message: 21/05/2002, 10h25
  5. R�ponses: 3
    Dernier message: 09/05/2002, 01h39

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