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 :

Fonction virtuelle appelée


Sujet :

C++

  1. #1
    Membre régulier
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Avril 2014
    Messages
    105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chargé d'affaire

    Informations forums :
    Inscription : Avril 2014
    Messages : 105
    Points : 97
    Points
    97
    Par défaut Fonction virtuelle appelée
    Bonjour tout le monde,

    Avant tout je vous souhaite une bonne année.

    Je suis confronté à une erreur que je n'arrive pas à comprendre.

    J'ai trois classes qui répondent au schémas suivant : PowerMetter<-AdvancedCapteur <-Capteur. (je m'excuse pour le franglais)

    J'ai une fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void Initialize (string)
    qui permet d’initialiser mon périphérique. Elle est déclarée comme étant virtuelle dans les classes AdvancedCapteur et Capteur.

    Lorsque je teste le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
            PowerMeter *a = new PowerMeter;
            a->Initialize(iniFile.toStdString());  // fait bien appel à powermetter::Initialize
            mSensorList.push_back(*a);
            mSensorList.at(mSensorList.size() - 1).Initialize(iniFile.toStdString()); // fait appel à AdvancedCapteur::Initialize
    powermetter::Initialize est appelée une seule fois. Je m'attends à ce qu'elle le soit une seconde fois puisque AdvancedCapteur::Initialize est déclaré comme étant virtuelle.

    (Pour info mSensorList est un std::vector d'objet de type AdvancedCapteur).

    Avez vous une idée?

    Pour info je vous laisse aussi la déclaration de mes classes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    class PowerMeter :
        public AdvancedCapteur
    {
    public:
        PowerMeter();
        ~PowerMeter();
        void Initialize(string IniFile);
     
    //bla bla bla
    }


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    class Capteur
    {
    public:
     
        Capteur();
    ~Capteur();  
        virtual void Initialize (string IniFile);
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    class AdvancedCapteur :
        public Capteur
    {
    public:
        AdvancedCapteur();
        ~AdvancedCapteur();
     
        virtual void Initialize(string IniFile) {};
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    void PowerMeter::Initialize(string iniFile)
    {
        Capteur::Initialize(iniFile);
    //...bla bla bla
    Ca fait deux heures que je me relis et que je fais des tests rien n'y fait... SOS!

  2. #2
    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
    D'après ma boule de crystal, mSensorList est déclarée comme std::vector<AdvancedCapteur> mSensorList; (ha ben oui tiens, tu le dis toi-même dans ton post), et donc comment espères-tu y stocker un PowerMetter (ce nom ) alors qu'il ne prend que des objets AdvancedCapteur ?
    La base du polymorpshime c'est les pointeurs et références. Le typage statique et dynamique.
    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.

  3. #3
    Membre régulier
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Avril 2014
    Messages
    105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chargé d'affaire

    Informations forums :
    Inscription : Avril 2014
    Messages : 105
    Points : 97
    Points
    97
    Par défaut
    Je suis un fou...

    Effectivement, je ne sais pas ce qui m'a pris...

    Le pire c'est que pour tester des hypothèses, j'ai écrit le code suivant :


    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
     
    int main(int argc, char *argv[])
    {
        QCoreApplication a(argc, argv);
     
        QVector<Base*> liste;
        liste.append(new Fille);
        liste.append(new Garcon);
     
        for (int i = 0; i < liste.size(); i++)
        {
            liste.at(i)->test();
            liste.at(i)->faisCa();
        }
        return a.exec();
    }
    qui lui marchait. J'ai passé une partie de la nuit à essayer de jouer aux 7 erreurs sans succès. Merci beaucoup Bousk.

  4. #4
    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
    Pour éviter les fuites mémoires, utilise un vector de unique_ptr.
    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.

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

Discussions similaires

  1. Appel de fonction virtuelle pure
    Par Darktib dans le forum Langage
    Réponses: 16
    Dernier message: 23/05/2009, 09h35
  2. Fonction appelant une fonction virtuelle pure
    Par oodini dans le forum C++
    Réponses: 12
    Dernier message: 19/09/2008, 08h24
  3. Réponses: 24
    Dernier message: 15/03/2007, 15h43
  4. Réponses: 2
    Dernier message: 05/03/2006, 19h29

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