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 :

faire de l'aller-retour dans class Polymorphique


Sujet :

C++

  1. #1
    Membre du Club
    Inscrit en
    Septembre 2006
    Messages
    113
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 113
    Points : 53
    Points
    53
    Par défaut faire de l'aller-retour dans class Polymorphique
    Salut à tous,

    voici les classes suivantes:

    "test1.h"
    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
    #pragma once
    #include <string>
    #include <iostream>
    #include <sstream>
     
     
    using namespace std;
    class Base{
    public:
    	std::string key_;
    	std::string baseDes_;
    	Base();
    	virtual void createKey();
    	void addClassNameToKey();
    };
     
    class Derivee1: public Base{
    public:
    	std::string derivee1Des_;
    	Derivee1();
    	void createKey();
    };
     
    class Derivee2:public Derivee1{
    public:
    	std::string derivee2Des_;
    	Derivee2();
    	void createKey();
    };

    et voici le cpp
    test1.cpp
    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
    #include "Test1.h"
     
    void Base::addClassNameToKey(){
        ostringstream os;
    	os << typeid(*this).name() ;
    	os << "||";
    	string s = os.str() ;
    	key_ = s + key_;
    }
     
    void Base::createKey(){
    	addClassNameToKey();
    	ostringstream os;
     
    	os << baseDes_;
    	os << "||";
     
    	key_ += os.str();
    }
     
    void Derivee1::createKey(){
    	addClassNameToKey();
     
    	ostringstream os;
    	os << derivee1Des_;
    	os << "||";
     
    	key_ += os.str();
    }
     
     
    void Derivee2::createKey(){
    	addClassNameToKey();
     
    	ostringstream os;
    	os << derivee2Des_;
    	os << "||";
    	key_ += os.str();
    }
     
    Base::Base(): 
    	baseDes_("Ceci est la caract de la classe Base") {
    		createKey();
    }
     
    Derivee1::Derivee1():
    	Base(), 
    	derivee1Des_("Ceci est la caract de la classe Derivee1"){
    		createKey();
    }
     
    Derivee2::Derivee2():
    	Derivee1(), 
    	derivee2Des_("Ceci est la caract de la classe Derivee2"){
    		createKey();
    }

    Lorsque je fais appel à la ligne suivante dans le main.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Derivee2 d2;
    cout << d2.key_;
    ca fonctionne et il m'affiche en console:
    "class Derivee2||class Derivee1||class Base||Ceci est la caract de la classe Base||Ceci est la caract de la classe Derivee1||Ceci est la caract de la classe Derivee2||"

    or ce que je voudrais c'est que pour une classe fille du type dérivée 2, il remonte jusque la base me chercher toutes les valeurs (en l'occurence BAseDes dans Base et Derivee1Des dans Derivee1, puis qu'il me cherche les infos de la classe où il est (càd derivée2) et qu'il m'affiche le nom de la classe où il est (càd class Derivee2) à l'aide de typeid.name()...
    Donc je voudrais ça comme output
    "class Derivee2||Ceci est la caract de la classe Base||Ceci est la caract de la classe Derivee1||Ceci est la caract de la classe Derivee2||"

    au lieu de
    "class Derivee2||class Derivee1||class Base||Ceci est la caract de la classe Base||Ceci est la caract de la classe Derivee1||Ceci est la caract de la classe Derivee2||"

    Notez la subtilité :-)


    J'ail l'impression qu'il s'agit d'une sorte d'aller retour dans les classes héritées:
    Dérivée2---> Derivee1 ---> Base --->Derivée2
    mais bon vu que ca marche pas...
    Si vous voyez...?? pcq moi je vois pas

    Merci

  2. #2
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Deux choses:
    1/ Quand tu construis un objet d'une classe, les constructeurs des classes de bases sont aussi appelés.
    2/ Pendant l'exécution d'un constructeur (et d'un destructeur), le type dynamique est le type en cours de construction et donc les membres virtuels ne fonctionnent pas comme tu as l'air de le penser.

  3. #3
    Membre du Club
    Inscrit en
    Septembre 2006
    Messages
    113
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 113
    Points : 53
    Points
    53
    Par défaut
    et donc?

  4. #4
    Membre éclairé

    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    717
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 717
    Points : 858
    Points
    858
    Par défaut
    et donc createKey() est appelée trois fois
    et donc addClassNameToKey() est également appelée trois fois
    et donc "class Derivee2||class Derivee1||class Base..."

  5. #5
    Membre actif
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    577
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 577
    Points : 256
    Points
    256

  6. #6
    Membre du Club
    Inscrit en
    Septembre 2006
    Messages
    113
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 113
    Points : 53
    Points
    53
    Par défaut
    okay, mais au vu du post par olive-le-malin (avec l'histoire de la camera), j'ai l'impression que ca marche pour un niveau d'héritage (enfin je crois)

    mais chez moi, avec mes deux niveaux:
    Base --> Derivée1 --> Derivee2
    j'ai essayé de faire une sorte de fonction d'initialisation, mais ca donne pas le résultat attendu.


    De plus je sais pas si c'est possible d'afficher ce genre d'output à la fois pour Derivee2:
    "class Derivee2||Ceci est la caract de la classe Base||Ceci est la caract de la classe Derivee1||Ceci est la caract de la classe Derivee2||"

    pour Dérivee1:
    "class Derivee1||Ceci est la caract de la classe Base||Ceci est la caract de la classe Derivee1"

    et pour Base:
    "class Base||Ceci est la caract de la classe Base"


    En gros j'ai l'impression que vous essayez de me balancer un peu vite dans les roses // :-)))

Discussions similaires

  1. Focus après un aller-retour dans une ListView
    Par regilait dans le forum Composants graphiques
    Réponses: 2
    Dernier message: 30/08/2011, 23h30
  2. Conversion type dans class POlymorphique
    Par dhoorens dans le forum C++
    Réponses: 11
    Dernier message: 18/06/2008, 14h49
  3. Réponses: 5
    Dernier message: 20/04/2006, 11h31
  4. Réponses: 13
    Dernier message: 30/11/2004, 06h16
  5. Visibilité de methodes dans Classe de Class
    Par Math75 dans le forum C++
    Réponses: 9
    Dernier message: 28/09/2004, 12h48

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