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 définition de méthode supplémentaires


Sujet :

C++

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2005
    Messages : 29
    Points : 28
    Points
    28
    Par défaut polymorphisme et définition de méthode supplémentaires
    Bonjour tout le monde
    donc voila je suis entrain de faire un mini interpréteur SQL en C++ et j'ai une classe abstraite Valeur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    class Valeur 
    {
    	public:
    		Valeur(){};
    		~Valeur(){};
    		virtual bool operator< (const Valeur& v) = 0;
    		virtual bool operator== (const Valeur& v) = 0;
    		virtual bool operator!= (const Valeur& v) = 0;
     
    };
    et j'ai 3 classes qui dérivent de cette classe de base.

    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
    class INTEGER : public Valeur 
    {
    	friend ostream& operator<<(ostream& stream,INTEGER& Int);
    	private:
    		int laValeur;
    	public:
    		INTEGER();
    		~INTEGER();
    		INTEGER(int v);
    		INTEGER(const INTEGER& v);
    		bool operator< (const Valeur& v);
    		bool operator== (const Valeur& v);
    		bool operator!= (const Valeur& v);
    		int getValeur() const;	
    };
    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
    class FL : public Valeur 
    {
    	friend ostream& operator<<(ostream& stream,FL& Fl);
    	private:
    		float laValeur;
    	public:
    		FL();
    		FL(float v);
    		FL(const FL& v);
    		~FL();
    		virtual bool operator< (const Valeur& v);
    		virtual bool operator== (const Valeur& v);
    		virtual bool operator!= (const Valeur& v);
    		float getValeur() const;	
    };
    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
    class STRING : public Valeur 
    {
    	friend ostream& operator<<(ostream& stream,STRING& Str);
    	private:
    		string laValeur;
    	public:
    		STRING();
    		STRING(string v);
    		STRING(const STRING& v);
    		~STRING();
    		bool operator< (const Valeur& v);
    		bool operator== (const Valeur& v);
    		bool operator!= (const Valeur& v);	
    		string getValeur();
    };
    et voila un main
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    int main()
    {
     
    	Valeur* val1[3];
     
    	val1[0] = new STRING("HIMADI");
    	val1[1] = new INTEGER(27);
    	val1[2] = new FL(300.35);
     
    	for(int i = 0 ; i < 3 ; i++)
    	{
    		cout << val1[i]->getValeur() << endl;
    	}
    }
    le problème c'est que le compilateur m'affiche une erreur comme quoi"udefined identifier getValeur()"
    est ce que cela veut dire que pour utiliser du polymorphisme en C++ on ne peut que redéfinir les méthodes dans la classe de base et dans ce cas on n'a pas le droit de définir d'autres méthodes supplémentaire ce qui me semble un peu bizard, ou bien est ce qu'il y a quelque chose qui m'échape??

    merci pour votre aide et soutien

  2. #2
    Membre éclairé Avatar de MatRem
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    750
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 750
    Points : 693
    Points
    693
    Par défaut
    Oui effectivement il faut que la méthode soit présente dans la classe de base.
    A priori si tu veux seulement faire de l'affichage, tu peut écrire une fonction toString, abstraite dans la classe de base. Celle ci sera redéfini dans les classes dérivées.

    Sinon si tu veux absolument récupérer la valeur stockée, je pense que les template seraient plus adaptés.

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2005
    Messages : 29
    Points : 28
    Points
    28
    Par défaut
    en fait ce n'est pas juste pour l'affichage mais c'est comme vous pouvez le constater je voudrais récupérer la valeur (un getter dans le fond) et la valeur récupérée change d'une classe dérivée à l'autre.
    mais ce qui m'a étonné le plus c'est qu'on ne peut pas ajouter des méthodes autres que celles présentent dans la classe de base.

    mais je pense que je vais régler le problème en passant par des string et faire des conversions à des int et des float en déclarant une méthode getter dans la classe de base qui retourne un string.

    je sais qu'on peut passer par des templates mais c'est que dans le cadre de mon cours je dois utiliser la notion de polymorphisme .

    en tout cas la réponse à ma question est là, on faisant du polymorphisme on ne peut pas utiliser une méthode d'une classe dérivée que si elle est déja présente dans la classe de base!

    merci beaucoup MatRem pour ta réponse

  4. #4
    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
    Tu peux toujours définir une opération, à spéciliaser, qui saura traiter les éléments "fils". C'est une autre façon de voir les choses que de foutre des accesseurs à tous les recoins de code.
    Au lieu d'un getValeur(), tu auras un serialize(), un read()/deserialize(), un binding préalable (cf http://www.developpez.net/forums/sho....php?t=186236), ...

    Sinon, tu peux regarder du côté des boost::any, des variants de boost, et dans ASL (d'Adobe, ils ont travaillé à des trucs dans le genre)
    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. Définition de méthodes pour une classe template
    Par Pragmateek dans le forum Langage
    Réponses: 13
    Dernier message: 20/12/2008, 01h46
  2. Réponses: 4
    Dernier message: 08/01/2008, 14h54
  3. Définition des méthodes agiles et raison de leurs succès ?
    Par benito1er dans le forum Méthodes Agiles
    Réponses: 2
    Dernier message: 26/12/2007, 14h23
  4. Polymorphisme - choix de la méthode
    Par Roy Miro dans le forum Langage
    Réponses: 5
    Dernier message: 23/06/2007, 18h18
  5. Polymorphisme : non-reconnaissance de méthode
    Par Chen norris dans le forum C++
    Réponses: 4
    Dernier message: 24/08/2006, 12h52

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