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 confirmé Avatar de LinuxUser
    Inscrit en
    Avril 2007
    Messages
    857
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 857
    Points : 616
    Points
    616
    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 chevronné Avatar de Ehonn
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2012
    Messages
    788
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France

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

    Informations forums :
    Inscription : Février 2012
    Messages : 788
    Points : 2 160
    Points
    2 160
    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 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    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 confirmé Avatar de LinuxUser
    Inscrit en
    Avril 2007
    Messages
    857
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 857
    Points : 616
    Points
    616
    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 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    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 confirmé Avatar de LinuxUser
    Inscrit en
    Avril 2007
    Messages
    857
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 857
    Points : 616
    Points
    616
    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 confirmé Avatar de LinuxUser
    Inscrit en
    Avril 2007
    Messages
    857
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 857
    Points : 616
    Points
    616
    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é
    Expert éminent

    Homme Profil pro
    tech lead c++ linux
    Inscrit en
    Août 2004
    Messages
    4 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : tech lead c++ linux

    Informations forums :
    Inscription : Août 2004
    Messages : 4 262
    Points : 6 680
    Points
    6 680
    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.
    « L'effort par lequel toute chose tend à persévérer dans son être n'est rien de plus que l'essence actuelle de cette chose. »
    Spinoza — Éthique III, Proposition VII

  9. #9
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    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 confirmé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    620
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2006
    Messages : 620
    Points : 453
    Points
    453
    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 émérite
    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
    Points : 2 799
    Points
    2 799
    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 confirmé Avatar de LinuxUser
    Inscrit en
    Avril 2007
    Messages
    857
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 857
    Points : 616
    Points
    616
    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é
    Expert éminent

    Homme Profil pro
    tech lead c++ linux
    Inscrit en
    Août 2004
    Messages
    4 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : tech lead c++ linux

    Informations forums :
    Inscription : Août 2004
    Messages : 4 262
    Points : 6 680
    Points
    6 680
    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.
    « L'effort par lequel toute chose tend à persévérer dans son être n'est rien de plus que l'essence actuelle de cette chose. »
    Spinoza — Éthique III, Proposition VII

  14. #14
    Membre confirmé Avatar de LinuxUser
    Inscrit en
    Avril 2007
    Messages
    857
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 857
    Points : 616
    Points
    616
    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