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 abstraite & méthodes virtuelles


Sujet :

C++

  1. #1
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Avril 2012
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2012
    Messages : 4
    Points : 4
    Points
    4
    Par défaut classe abstraite & méthodes virtuelles
    Bonjour, après avoir lu plusieurs tutoriels sur l'héritage en C++, je ne parviens pas à trouver la solution à mon problème. J'obtiens cette erreur de compilation:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Undefined symbols for architecture x86_64:
      "_main", referenced from:
          start in crt1.10.6.o
      "vtable for Fille", referenced from:
          Fille::Fille()    in Fille.o
          Fille::Fille()    in Fille.o
      NOTE: a missing vtable usually means the first non-inline virtual member function has no definition.
    ld: symbol(s) not found for architecture x86_64
    collect2: ld returned 1 exit status
    make: *** [main] Error 1
    En ce qui concerne mon code, j'ai une classe mère et une classe fille. La classe mère ne contient qu'une fonction virtuelle pure et j'implémente donc cette fonction "chez" la fille. Voici un code qui résume la situation:

    Mère.hpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    class Mère
    {
    public:
        virtual double fonction(double dontcare) = 0; // Je la déclare pure
    }
    Fille.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Fille::Fille():value(2) {}
     
    double fonction(double dontcare) {
        /*Implémentation de la méthode*/
    }
    Fille.hpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    class Fille : public Mère {
       private:
          double value;
       public: 
          Fille();
          double fonction(double dontcare);
    }
    J'ai dû louper une partie dans les tutoriels que j'ai lu, pouvez-vous m'éclairer ?merci

  2. #2
    Membre expérimenté

    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2011
    Messages
    685
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2011
    Messages : 685
    Points : 1 418
    Points
    1 418
    Par défaut
    Dans ce bout de code en tout cas ce que tu as zappé c'est les ";" à la fin des définition de classe. Sinon rien d'anormal :

    ce bout de code fonctionne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    #ifndef MERE_HPP
    #define MERE_HPP
    class mere
    {
     
        public :
            virtual double DoSomething( double test) =0;
     
    };
    #endif
    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
     
    #ifndef FILLE_HPP
    #define FILLE_HPP
    #include "Mere.hpp"
     
    class fille : public Mere//edit : oups petit oubli de ma part :)
    {
        private :
            double test;
        public :
            fille();
            double DoSomething( double test2);
            double get();
     
    };
    #endif
    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
     
    #include "fille.hpp"
     
     
    fille::fille() :
    test(2)
    {
     
    }
     
    double fille::DoSomething(double test2)
    {
        test = test2;
    }
     
    double fille::get()
    {
        return test;
    }
    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 <iostream>
    #include "fille.hpp"
     
    using namespace std;
     
    int main()
    {
     
        fille f;
        cout << f.get() << endl;//affiche 2
        f.DoSomething(5);
        cout << f.get() << endl;//affiche 5
        return 0;
    }
    Ce n'est donc pas un problème d'héritage (attention aux accents dans les noms des classes aussi..)

  3. #3
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Avril 2012
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2012
    Messages : 4
    Points : 4
    Points
    4
    Par défaut
    dans le hpp de Fille, il n'y a pas besoin d'ajouter ":public Mère" ? Comment le compilateur sait-il que Fille hérite de Mère?
    PS : Le code que j'ai donné représente la situation, les accents ne sont pas présents et les ; le sont dans mon code

  4. #4
    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 : 45
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Points : 4 637
    Points
    4 637
    Par défaut
    Citation Envoyé par Tho123 Voir le message
    dans le hpp de Fille, il n'y a pas besoin d'ajouter ":public Mère" ? Comment le compilateur sait-il que Fille hérite de Mère?
    Si.

    Pour en revenir en ton problème, dans Fille.cpp, c'est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    double Fille::fonction(double dontcare)
    et non
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    double fonction(double dontcare)
    Sinon tu ne fais que définir une fonction libre "fonction" et non définir la méthode de la classe Fille.

  5. #5
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Avril 2012
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2012
    Messages : 4
    Points : 4
    Points
    4
    Par défaut
    Voilà donc ce que j'avais loupé. Merci beaucoup!

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

Discussions similaires

  1. Classe abstraite et méthodes virtuelles
    Par Daikyo dans le forum Langage
    Réponses: 10
    Dernier message: 16/11/2010, 16h50
  2. Interfaces/Classes abstraites et méthodes statiques
    Par Zakapatul dans le forum VB.NET
    Réponses: 7
    Dernier message: 06/01/2009, 15h38
  3. Réponses: 23
    Dernier message: 16/03/2007, 21h21
  4. Réponses: 14
    Dernier message: 17/11/2006, 20h17
  5. Réponses: 6
    Dernier message: 27/07/2005, 10h06

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