C++ : Erreur stupide d'héritage
Répondre à la discussion
Affichage des résultats 1 à 3 sur 3

C++ : Erreur stupide d'héritage



  1. #1
    destroyedlolo

    C++ : Erreur stupide d'héritage


    ------

    Bonjour,

    J'ai sans doute fait une erreur stupide ... mais je ne vois pas ou : j'ai donc besoin d'un regard extérieur

    Voici mon code :
    Code:
    #include <cstdio>
    
    class SortDir {
    	virtual bool accept( const char *fch, const char *dir ){
    		puts("SortDir:accept()");
    	}
    public:
    	SortDir() { this->accept( NULL, NULL); };
    };
    
    class ConfigDir : virtual public SortDir {
    protected :
    	virtual bool accept( const char *fch, const char *dir ){
    		puts("ConfigDir:accept()");
    	};
    
    public:
    	ConfigDir() : SortDir(){ };
    };
    
    int main( int, char **){
    	ConfigDir sd;
    }
    Malgré les virtuals ... comment se fait-il que c'est l'accept() de SortDir qui est appelé et pas celui de ConfigDir ?

    Comme sd est un ConfigDir, je m'attendais a ce que ce soit la fonction surchagée qui soit appelée et non l'originale.

    Merci pour vos lumières

    -----

  2. #2
    pm42

    Re : C++ : Erreur stupide d'héritage

    Parce que tu l'appelles depuis un constructeur et comme la sous-classe n'est pas encore complètement construite, C++ ignore le "virtual".
    C'est classique dans ce langage (mais différent dans d'autres).

    https://isocpp.org/wiki/faq/strange-...als-from-ctors

  3. #3
    destroyedlolo

    Re : C++ : Erreur stupide d'héritage

    Arg ! Et bien je viens d'apprendre un truc

    Bref, j'ai changé mon code comme suit et ca marche

    Code:
    #include <cstdio>
    
    class SortDir {
    	virtual bool accept( const char *fch, const char *dir ){
    		puts("SortDir:accept()");
    	}
    
    protected:
    	void readcontent(){ this->accept( NULL, NULL); };
    
    public:
    	SortDir( const char * ) { this->readcontent(); };
    	SortDir(){};
    };
    
    class ConfigDir : virtual public SortDir {
    protected :
    	virtual bool accept( const char *fch, const char *dir ){
    		puts("configDir:accept()");
    	};
    
    public:
    	ConfigDir( const char * ) { this->readcontent(); };
    };
    
    int main( int, char **){
    	ConfigDir sd("toto");
    }
    Merci pour ces infos.

Discussions similaires

  1. Héritage
    Par invitecc87dbce dans le forum Programmation et langages, Algorithmique
    Réponses: 0
    Dernier message: 27/05/2012, 20h32
  2. L'héritage
    Par vanos dans le forum Science ludique : la science en s'amusant
    Réponses: 5
    Dernier message: 03/04/2012, 01h59
  3. problème d'héritage
    Par invitee2f3230c dans le forum Logiciel - Software - Open Source
    Réponses: 0
    Dernier message: 13/05/2011, 19h22
  4. Problème stupide... Question stupide...
    Par invite750fd699 dans le forum Électronique
    Réponses: 22
    Dernier message: 19/03/2009, 16h21
  5. Enigme: L'héritage.
    Par invite3bc71fae dans le forum Science ludique : la science en s'amusant
    Réponses: 345
    Dernier message: 23/09/2004, 22h30