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 :

Classe qui herite de classe abstraite sans etre elle-meme abstraite


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    348
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 348
    Par défaut Classe qui herite de classe abstraite sans etre elle-meme abstraite
    Bonjour a tous,

    Voici mon code :

    RacineFonctions.hxx
    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
     
    #include "Intervalle.hxx"
     
    #ifndef RACINEFONCTIONS
    #define RACINEFONCTIONS
     
    using namespace std;
     
    class RacineFonctions
    {
    	public:
    	virtual double Evalue (int, double) const /*=0*/;
    	virtual Intervalle Evalue (int, const Intervalle&) const /*=0*/;
    };
    #endif
    RacineFonctions.cxx
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    #include "RacineFonctions.hxx"
     
    double RacineFonctions::Evalue (int a, double b) const 
    {
    	//return 0.;
    }
     
    Intervalle RacineFonctions::Evalue (int a, const Intervalle &I) const 
    {
    	//return I;
    }
    Polynome.cxx
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    /*du code ici*/
    double Polynome::Evalue (int level, double x)
    {
    	RacineFonctions::Evalue(level, x);
    	Polynome P;
            //suite du code
    //[...]
    Polynome.hxx
    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
     
    #include "RacineFonctions.hxx"
    #include <string>
     
    using namespace std;
     
    #ifndef POLYNOME
    #define POLYNOME
     
    class Polynome : public RacineFonctions
    {
    	private:
    	int Degre;
    	double* Coefficients;
     
    	public:
    	Polynome(int=0, double* = NULL);
    	Polynome(const Polynome&);
    	~Polynome(void);
    	double Evalue(int, double);
    	Intervalle Evalue(int, const Intervalle&);
    	void AffichePolynome(void) const;
     
    	Polynome& operator = (const Polynome&);
    };
    #endif
    Probleme: Il m'est demande de declarer les fonctions virtuelles de la classe mere "RacinesFonction" en virtuelles pures, en ajoutant un =0. Mais si je fais ca, le compilateur me dit que l'appel au constructeur de Polynome ne peut se faire, car Polynome est abstrait. Donc si je comprends bien ce qu'il essaie de me dire, tous "descendant" d'une classe abstraite est lui-meme abstrait !? J'espere me tromper, mais je n'arrive pas a y remedier...

    Merci d'avance.

    PS: Desole pour le peu de code devoile, je suis oblige de faire ainsi parce que mes profs utilisent compilatio pour corriger, donc s'il trouve mon code sur le net je suis mal.

    Edit: On nous a enseigne tres rapidement a l'ecole les regles de base a respecter sur les classes abstraites, mais comme notre prof a oublie de mettre a disposition ce cours sur le net comme il l'a promis, je ne m'en souviens pas. En particulier faut-il imperativement redefinir la base canonique de la classe abstraite? J'espere que non, sinon j'ai un travail enorme a faire!

  2. #2
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Par défaut
    Citation Envoyé par User Name Voir le message
    Donc si je comprends bien ce qu'il essaie de me dire, tous "descendant" d'une classe abstraite est lui-meme abstrait !? J'espere me tromper, mais je n'arrive pas a y remedier...
    Non. Les classes dérivées d'une classe abstraites sont elles-même abstraites si elles n'implémentent pas une ou plusieurs fonctions virutelles pures dans la classe de base.

    si toutes les fonctions virtuelles pures sont implémentées dans la classe dérivée (ou dans une classe iintermédiaire) la classe dérivée est concrête et non abstraite.

    Dans ton exemple, le problème vient du fait que Polynome n’implémente pas les deux méthodes:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    virtual double Evalue (int, double) const /*=0*/;
    virtual Intervalle Evalue (int, const Intervalle&) const /*=0*/;
    En effet, dans la classe Polynome, ces deux fonctions ne sont pas déclarées const, ce ne sont donc pas les mêmes fonctions. Déclares les const dans Polynome et cela devrait fonctionner.

  3. #3
    Membre très actif
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    348
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 348
    Par défaut
    Ok, merci pour ta reponse. J'ai compris ca, c'est deja bien, meme si je ne peux pas appliquer ta solution parce que ma fonction est censee modifier (*this). Et elle refusera de le faire si je mets "const" ici.

    Je vais regarder mon code pour envisager une autre solution.

    Merci.

  4. #4
    screetch
    Invité(e)
    Par défaut
    pourquoi as tu besoin de modifier le polynome pour l'évaluer?? ca ne me paraît pas correct. C'est sans doute la que tu as une erreur.

  5. #5
    Membre très actif
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    348
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 348
    Par défaut
    C'est regle : je me suis arrange pour que ce ne soit plus le (*this) qui soit modifie, mais une copie de (*this) dans ma fonction.

  6. #6
    Membre émérite

    Homme Profil pro
    Directeur des systèmes d'information
    Inscrit en
    Septembre 2010
    Messages
    450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Directeur des systèmes d'information

    Informations forums :
    Inscription : Septembre 2010
    Messages : 450
    Par défaut
    Citation Envoyé par User Name Voir le message
    mais comme notre prof a oublie de mettre a disposition ce cours sur le net comme il l'a promis, je ne m'en souviens pas.
    http://frog.isima.fr/antoine/heritage.shtml
    http://sites.univ-provence.fr/wcpp/V1/Lecons/L23.pdf
    http://fr.wikibooks.org/wiki/Program...ses_abstraites

    etc etc. Savoir se trouver de la documentation est la qualité numéro 1 d'un développeur
    Si vous moinsez, merci de répondre pour argumenter!
    Ma présentation

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

Discussions similaires

  1. Problème avec des classes qui etendent la classe View
    Par amsagitos dans le forum Composants graphiques
    Réponses: 0
    Dernier message: 14/09/2011, 22h14
  2. éxecuter une classe qui contient une classe annonyme
    Par star-watcher dans le forum Débuter avec Java
    Réponses: 9
    Dernier message: 09/03/2009, 01h26
  3. Réponses: 0
    Dernier message: 05/08/2008, 10h20
  4. Réponses: 2
    Dernier message: 02/02/2008, 07h37
  5. destruction d'une classe qui herite de CDialog
    Par philippe V dans le forum MFC
    Réponses: 2
    Dernier message: 03/02/2004, 17h39

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