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

Langage C++ Discussion :

Impossible d'impl�menter une classe abstraite alors que les m�thodes abstraites sont impl�ment�es


Sujet :

Langage C++

  1. #1
    Membre �clair� Avatar de touftouf57
    Profil pro
    D�veloppeur .NET
    Inscrit en
    D�cembre 2007
    Messages
    362
    D�tails du profil
    Informations personnelles :
    �ge : 47
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activit� : D�veloppeur .NET
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : D�cembre 2007
    Messages : 362
    Par d�faut Impossible d'impl�menter une classe abstraite alors que les m�thodes abstraites sont impl�ment�es
    Bonjour � tous, et bonnes f�tes de fin d'ann�e.

    Bon j'ai un souci, sous visual studio 2008 en C++.

    Voila j'ai cr�� une "interface" Deplacable qui contient une seule m�thode:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    virtual void deplacer(int x, int y)=0;
    Vu quelle est virtuelle pure, c'est pour �a que j'ai d�fini cette classe comme une interface. Bref j'ai une classe ObjetAnime qui h�rite de Deplacable et qui impl�mente donc la m�thode deplacer(int x, int y).
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    void ObjetAnime::deplacer(int x, int y){//déplacement relatif
    	setX(getX()+x);
    	setY(getY()+y);
    }
    Maintenant j'ai une classe abstraite DeplacableHorizontal qui h�rite de Deplacable:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    class DeplacableHorizontal: public Deplacable{
    public:
    	DeplacableHorizontal(short vitesseH=0);
    	virtual void deplGauche();
    	virtual void deplDroite();
    ...
    et voici leurs impl�mentations
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
     
    void DeplacableHorizontal::deplGauche(){
    	deplacer(-_vitesseH,0);
    }
     
    void DeplacableHorizontal::deplDroite(){
    	deplacer(_vitesseH,0);
    }
    Et c'est maintenant que le probl�me arrive. J'ai une classe Missile qui h�rite de ObjetAnime et de DeplacableHorizontal.
    Et � la compil, je me prend une erreur C2259: "Missile": impossible d'instancier une classe abstraite � cause des membres suivants:
    'void Deplacable::deplacer(int,int)' est abstrait


    Pourtant deplacer est d�fini dans la classe ObjetAnime.
    Faut-il absolument �crire dans le Missile.h
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    virtual void deplacer(int x, int y);
    pour que cela fonctionne, m�me si on ne l'impl�mente pas dans le cpp?
    Je trouve cela un peu tordu de red�finir des m�thodes qui le sont d�j�.

  2. #2
    R�dacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par d�faut
    Salut,
    Si je reprends ta description tu as comme h�ritage :
    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
    struct Deplacable
    {
       virtual void deplace()=0;
       virtual ~Deplacable(){}
    };
     
    struct ObjetAnime : public Deplacable
    {
       virtual void deplace(){std::cout<<"objetAnime\n";}
    };
     
    struct DeplacableHorizontal : public Deplacable
    {
       virtual void deplGauche(){deplace();}
    };
     
    struct MonMissile : public DeplacableHorizontal, public ObjetAnime
    {
    };
    MonMissile h�rite 2 fois de la classe Deplacable :
    => Une fois via l'h�ritage DeplacableHorizontal => Deplacable
    => Une fois via l'h�ritage ObjetAnime => Deplacable

    Or, seule une branche sp�cialise la fonction abstraite (ObjectAnime). D'o� ton erreur.

    La solution : passer par l'h�ritage virtuel (F.A.Q Qu'est-ce que l'h�ritage virtuel et quelle est son utilit� ?)

    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
    struct Deplacable
    {
       virtual void deplace()=0;
       virtual ~Deplacable(){}
    };
     
    struct ObjetAnime : public virtual Deplacable
    {
       virtual void deplace(){std::cout<<"objetAnime\n";}
    };
     
    struct DeplacableHorizontal : public virtual Deplacable
    {
       virtual void deplGauche(){deplace();}
    };
     
    struct MonMissile : public DeplacableHorizontal, public ObjetAnime
    {
    };
    Voir aussi : Les fonctions virtuelles en C++.

  3. #3
    Membre �clair� Avatar de touftouf57
    Profil pro
    D�veloppeur .NET
    Inscrit en
    D�cembre 2007
    Messages
    362
    D�tails du profil
    Informations personnelles :
    �ge : 47
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activit� : D�veloppeur .NET
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : D�cembre 2007
    Messages : 362
    Par d�faut
    Merci beaucoup,
    C'est une partie du cours que l'on a pas �tudi� volontairement, le prof nous a conseill� de lire cette partie une fois qu'on aurait un peu plus de bouteille en C++.

    J'ai cette configuration (h�ritage en diamant) dans plusieurs endroits de mon projet.
    Puisque je ne veux jamais de doublon dans ce projet, serait-il judicieux de toujours faire de l'h�ritage virtuel?

    En tout cas merci.

  4. #4
    Membre Expert

    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 49
    Localisation : France, Bouches du Rh�ne (Provence Alpes C�te d'Azur)

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : High Tech - Op�rateur de t�l�communications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Par d�faut
    Citation Envoy� par touftouf57 Voir le message
    Merci beaucoup,
    C'est une partie du cours que l'on a pas �tudi� volontairement, le prof nous a conseill� de lire cette partie une fois qu'on aurait un peu plus de bouteille en C++.

    J'ai cette configuration (h�ritage en diamant) dans plusieurs endroits de mon projet.
    Puisque je ne veux jamais de doublon dans ce projet, serait-il judicieux de toujours faire de l'h�ritage virtuel?

    En tout cas merci.
    Toujours ? Diable non !

    Par contre, tu peux te demander si l'h�ritage est bien la solution � employer dans chaque cas. Il existe des r�gles � respecter sur le sujet qui vont bien plus loin que la relation informelle "est un".
    [FAQ des forums][FAQ D�veloppement 2D, 3D et Jeux][Si vous ne savez pas ou vous en �tes...]
    Essayez d'�crire clairement (c'est � dire avec des mots fran�ais complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Caf�. C'est d�pass� tout �a.
    Et si vous �tes sages, vous aurez peut �tre vous aussi la chance de passer � la t�l�. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

  5. #5
    Membre �clair� Avatar de touftouf57
    Profil pro
    D�veloppeur .NET
    Inscrit en
    D�cembre 2007
    Messages
    362
    D�tails du profil
    Informations personnelles :
    �ge : 47
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activit� : D�veloppeur .NET
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : D�cembre 2007
    Messages : 362
    Par d�faut
    Bonjour Emmanuel Deloget

    Le "toujours" fait r�f�rence uniquement � ce projet.
    Il existe des r�gles � respecter sur le sujet qui vont bien plus loin que la relation informelle "est un".
    Tu fais r�f�rence au design pattern strategy? Si c'est le cas je ne vois pas vraiment comment l'impl�menter ici.