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 :

Impl�mentation d'une m�thode virtuelle pure par la classe d�riv�e


Sujet :

C++

  1. #1
    Membre �clair� Avatar de LinuxUser
    Inscrit en
    Avril 2007
    Messages
    857
    D�tails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 857
    Par d�faut Impl�mentation d'une m�thode virtuelle pure par la classe d�riv�e
    Bonjour,

    Je cherche � impl�menter une m�thode virtuelle pure h�rit�e (dans la classe d�riv�e).
    Je pensais avoir bien fait les choses et pourtant, j'ai une erreur � la compulation qui m'indique que je dois impl�menter la m�thode pure h�rit�e (ce que j'ai pourtant fait), voici le topo :


    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    class Abstract
    {
    ...
    virtual double function() const=0;
    };
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    class Derived : public Abstract
    {
    ...
    virtual double function() const;
    };
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    #include "Derived.h"
    ...
    double Derived::function() const
    {
    // implementation
    }
    L'erreur survient lorsque j'instancie une classe d�riv�e
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    m_derived  = Derived();
    // ERROR : must implement inherited pure virtual fucntion Abstract::function()
    Je comprends pas ce que j'ai fait de travers.

    EDIT: je pr�cise que la classe Abstract a d'autres fonctions virtuelles simples, mais l'erreur concerne uniquement la virtuelle pure.

    EDIT : correction dans Derived.cpp : double Derived::function() const et non double function() const
    Merci de votre aide.

  2. #2
    Membre Expert Avatar de Ehonn
    Homme Profil pro
    �tudiant
    Inscrit en
    F�vrier 2012
    Messages
    788
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 35
    Localisation : France

    Informations professionnelles :
    Activit� : �tudiant
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : F�vrier 2012
    Messages : 788
    Par d�faut
    Dans ton .cpp
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    double function() const { }
    doit �tre
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    double Derived::function() const { }
    (?)

  3. #3
    R�dacteur/Mod�rateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 153
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 38
    Localisation : Canada

    Informations professionnelles :
    Activit� : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 153
    Billets dans le blog
    4
    Par d�faut
    Bonjour,

    dans un .cpp l'impl�mentation d'une fonction membre c'est
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    TypeReturn MyClass::MyMethod(args) [const]
    {
    }
    Pensez � consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation r�seau ?
    Aucune aide via MP ne sera dispens�e. Merci d'utiliser les forums pr�vus � cet effet.

  4. #4
    Membre �clair� Avatar de LinuxUser
    Inscrit en
    Avril 2007
    Messages
    857
    D�tails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 857
    Par d�faut
    Oui merci j'ai corrig� dans l'exemple, c'�tait juste un oubli dans l'exemple (dans mon code c'�tait d�j� bon).

  5. #5
    R�dacteur/Mod�rateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 153
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 38
    Localisation : Canada

    Informations professionnelles :
    Activit� : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 153
    Billets dans le blog
    4
    Par d�faut
    Le code que tu pr�sentes est bon.
    As-tu une surcharge de la m�thode non const ?
    Pensez � consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation r�seau ?
    Aucune aide via MP ne sera dispens�e. Merci d'utiliser les forums pr�vus � cet effet.

  6. #6
    Membre �clair� Avatar de LinuxUser
    Inscrit en
    Avril 2007
    Messages
    857
    D�tails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 857
    Par d�faut
    Non, la fonction est impl�ment�e une seule fois comme indiqu� au-dessus.

    EDIT: je suis sous Eclipse, et l'erreur apparait imm�diatement d�s que je d�clare la classe d�riv�e comme varible membre d'une autre classe:

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    class DerivedUser
    {
    ...
    Derived m_derived;
    // ERROR : must implement inherited oure virtual function Abstract::function()
    };

  7. #7
    Membre �clair� Avatar de LinuxUser
    Inscrit en
    Avril 2007
    Messages
    857
    D�tails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 857
    Par d�faut
    Apparement la solution est d'utiliser un pointer sur un objet de la classe d�riv�e:

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    class DerivedUser
    {
    ...
    Derived* m_derived; // là c'est bon
    };
    J'ai vu �a sur Stack Overflow :
    http://stackoverflow.com/questions/4...-abstract-type

    Mais j'ai pas bien compris pourquoi.

    EDIT : en fait nan �a marche pas, je peux juste d�clarer un membre de type Derived*, mais il me dis toujours qu'il faiut impl�menter la m�thode virtuelle pure h�rit�e.

  8. #8
    r0d
    r0d est d�connect�
    Membre exp�riment�

    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Ao�t 2004
    Messages
    4 299
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rh�ne Alpes)

    Informations professionnelles :
    Activit� : D�veloppeur informatique

    Informations forums :
    Inscription : Ao�t 2004
    Messages : 4 299
    Billets dans le blog
    2
    Par d�faut
    Nan mais ton code est bon, le probl�me est ailleurs.
    Ou alors tu as fait une faute de frappe (genre uns fois tu �cris function, et une autre fonction, ou Fonction) ou un truc comme �a.

  9. #9
    R�dacteur/Mod�rateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 153
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 38
    Localisation : Canada

    Informations professionnelles :
    Activit� : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 153
    Billets dans le blog
    4
    Par d�faut
    Pourrait-on voir plus de code et du vrai code ? Includes compris ?
    Parce que ce simple h�ritage avec la m�thode virtual impl�ment�e dans la classe d�riv�e est tout � fait correct.
    Pensez � consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation r�seau ?
    Aucune aide via MP ne sera dispens�e. Merci d'utiliser les forums pr�vus � cet effet.

  10. #10
    Membre �clair�
    Profil pro
    Inscrit en
    Ao�t 2006
    Messages
    620
    D�tails du profil
    Informations personnelles :
    �ge : 48
    Localisation : France, Paris (�le de France)

    Informations forums :
    Inscription : Ao�t 2006
    Messages : 620
    Par d�faut
    Je ne vois pas pourquoi le probl�me viendrait de l� dans ton cas... Le cas que tu cites sur stackoverflow est diff�rent : il essaye d'instancier un objet d'une classe abstraite pure. Les classes abstraites pures sont plut�t faites pour servir d'interface - pour ce que je comprends du C++ en tout cas - et certainement pas pour �tre instanci�es.
    Dans le cas de stackoverflow il essaye d'�crire :

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    ClassAbstraitePure MonObjet;
    Ce qui demande l'instanciation d'une classe abstraite pure. Ce qu'il faut faire c'est :

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    ClassAbstraitePure* MonObjet;
    Ce qui demande la cr�ation d'un pointeur vers la classe abstraite pure, qui pourra accueillir tout objet d'une classe d�riv�e de ClassAbstraitePure, qui elles seront bien instanciables.

    Dans ton cas, tu cr�es bien un objet d�riv� instanciable... du coup, pour moi, c'est un peu myst�rieux..

  11. #11
    Membre Expert
    Avatar de white_tentacle
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    1 505
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 1 505
    Par d�faut
    C�est la seule erreur que tu as ?

    Parce que si le code de double Derived::function() const ne compile pas, tu peux te retrouver avec cette erreur en plus d�une pr�c�dente.

    L�autre possibilit� est que tu n��dites / compiles pas le bon fichier, car comme l�ont dit les autres, l�extrait que tu montres est correct.

  12. #12
    Membre �clair� Avatar de LinuxUser
    Inscrit en
    Avril 2007
    Messages
    857
    D�tails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 857
    Par d�faut
    OK.

    Classe abstraite
    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
    #ifndef RHEOLOGY_H_
    #define RHEOLOGY_H_
    /**
     * @class Rheology Rheology.h
     * @brief This class defines features of rheology law
     */
    class Rheology
    {
    public:
    /******************************** CONSTRUCTOR *********************************/
    	/**
             * @brief Default constructor.
             */
    	Rheology();
    /********************************* DESTRUCTOR *********************************/
    	/**
             * @brief Default destructor.
             */
    	virtual ~Rheology();
    /*********************************** METHODS **********************************/
    	virtual double sigmaCalc(double epsilon) const=0;
    };
     
    #endif /* RHEOLOGY_H_ */
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    #include "Rheology.h"
     
    Rheology::Rheology()
    {
    }
     
    Rheology::~Rheology()
    {
    }
    Classe d�riv�e
    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
    #ifndef SMATCH_H_
    #define SMATCH_H_
     
    #include "Rheology.h"
    /**
     * @class Smatch Smatch.h
     * @brief This class defines the Smatch law
     */
    class Smatch: public Rheology
    {
    public:
    /******************************** CONSTRUCTOR *********************************/
    	/**
             * @brief Default constructor.
             */
    	Smatch();
    /********************************* DESTRUCTOR *********************************/
    	/**
             * @brief Default destructor.
             */
    	virtual ~Smatch();
    /*********************************** METHODS **********************************/
    	virtual double sigmaCalc(double epsilon, double offsetYieldStress) const;
    };
     
    #endif /* SMATCH_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
    #include "Smatch.h"
     
    Smatch::Smatch()
    {
    }
     
     
    Smatch::~Smatch()
    {
    }
     
    double Smatch::sigmaCalc(double epsilon, double offsetYieldStress) const
    {
    	double sigma = 0.0;
     
    	return (sigma);
    }
    Classe utilisant la classe d�riv�e
    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
    #ifndef MODELHANDLER_H_
    #define MODELHANDLER_H_
     
    #include "Smatch.h"
    #include <math.h>
     
    /**
     * @class ModelHandler ModelHandler.h
     * @brief This class provides an interface to use models
     */
    class ModelHandler
    {
    public:
    /******************************** CONSTRUCTOR *********************************/
    	/**
             * @brief Default constructor.
             */
    	ModelHandler();
    /********************************* DESTRUCTOR *********************************/
    	/**
             * @brief Default destructor.
             */
    	virtual ~ModelHandler();
    /*********************************** METHODS **********************************/
    	/**
             * @brief Initialize rheology parameters of Smatch law
             * @pre
             */
    	int initializeRheology(double& A, double& B, double& C, double& D);
    private:
    	Smatch m_rheologySmatch;
    };
     
    #endif /* MODELHANDLER_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
    #include "ModelHandler.h"
     
    ModelHandler::ModelHandler() :
    		m_rheologySmatch()
    {
    }
    ModelHandler::~ModelHandler()
    {
    }
     
    int ModelHandler::initializeRheology(double& A, double& B, double& C, double& D)
    {
    	m_rheologySmatch = Smatch(A, B, C, D);
     
    	return (0);
    }
    R�sultat � la compilation:
    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
    In file included from ModelHandler.cpp:1:0:
    ModelHandler.h:31:9: erreur: cannot declare field ‘ModelHandler::m_rheologySmatch’ to be of abstract type ‘Smatch’
    In file included from ModelHandler.h:4:0,
                     from ModelHandler.cpp:1:
    Smatch.h:9:7: note:   because the following virtual functions are pure within ‘Smatch’:
    In file included from Smatch.h:4:0,
                     from ModelHandler.h:4,
                     from ModelHandler.cpp:1:
    Rheology.h:21:17: note: 	virtual double Rheology::sigmaCalc(double) const
    ModelHandler.cpp: In constructor ‘ModelHandler::ModelHandler()’:
    ModelHandler.cpp:4:20: erreur: cannot allocate an object of abstract type ‘Smatch’
    In file included from ModelHandler.h:4:0,
                     from ModelHandler.cpp:1:
    Smatch.h:9:7: note:   since type ‘Smatch’ has pure virtual functions
    ModelHandler.cpp: In member function ‘int ModelHandler::initializeRheology(double&, double&, double&, double&)’:
    ModelHandler.cpp:13:38: erreur: cannot allocate an object of abstract type ‘Smatch’
    In file included from ModelHandler.h:4:0,
                     from ModelHandler.cpp:1:
    Smatch.h:9:7: note:   since type ‘Smatch’ has pure virtual functions

  13. #13
    r0d
    r0d est d�connect�
    Membre exp�riment�

    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Ao�t 2004
    Messages
    4 299
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rh�ne Alpes)

    Informations professionnelles :
    Activit� : D�veloppeur informatique

    Informations forums :
    Inscription : Ao�t 2004
    Messages : 4 299
    Billets dans le blog
    2
    Par d�faut
    Ok: ta fonction d�riv�e n'a pas la m�me signature que celle de la classe de base.

  14. #14
    Membre �clair� Avatar de LinuxUser
    Inscrit en
    Avril 2007
    Messages
    857
    D�tails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 857
    Par d�faut
    quel con.

    Merci infiniment.

+ R�pondre � la discussion
Cette discussion est r�solue.

Discussions similaires

  1. R�ponses: 5
    Dernier message: 14/10/2012, 19h25
  2. R�ponses: 15
    Dernier message: 08/07/2012, 23h49
  3. R�ponses: 17
    Dernier message: 29/07/2009, 17h12
  4. R�ponses: 2
    Dernier message: 02/10/2008, 16h37
  5. Probl�me avec une m�thode virtuelle pure
    Par Burckel dans le forum C++
    R�ponses: 4
    Dernier message: 05/12/2006, 13h00

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