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 :

probl�me avec le mot cl� "virtual"


Sujet :

C++

  1. #1
    Membre confirm�
    Inscrit en
    Avril 2007
    Messages
    82
    D�tails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 82
    Par d�faut probl�me avec le mot cl� "virtual"
    Bonjour , j'ai plusieurs questions, imaginons la hi�rarchie suivante :
    Classe m�re: Avion ( abstraite )
    Classe Fille: Combat ( abstraite )
    Classe 'petite' Fille : F

    J'instancie un objet F dans le main et aimerait afficher ses caract�ristiques avec une m�thode virtuelle impl�ment�e dans la classe M�re.

    Avion.h
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    class Avion{			// Classe abstraite!
    	protected:
    		//...
    	public:
    		Avion() {}
    		virtual ~Avion() {}
    		virtual void abstract() = 0;
    		virtual void Affichage(Avion &);
    };
    Avion.cpp
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
     
    void Avion :: Affichage(Avion& a)
    {
    	// ...
    }
    Combat.h
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #include "Avion.h"
    class Combat : public Avion  // Classe abstraite!
    {
    	public:
                    Combat() {}[EDIT]
    		virtual ~Combat() {}
    		virtual void abstract () = 0;
    		virtual void Affichage() {}
    	protected:
    	         //...	
    };
    F.h
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    #include "Combat.h"
    class F : public Combat{
    	public:
    		F() {}
    		~F() {}
                    void abstract() {}
    		void Affichage(F &);
    	private:
                //...
    };
    F.cpp
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
     
    #include "F.h"
    void F::Affichage(F & avion)
    {
    	Avion::Affichage(avion);
    }
    Comment proc�der ?
    J'ai une erreur semblable � �a :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
     undefined reference to `vtable for F'
    Est-ce que d'autres erreurs se cachent derri�re en plus?

    Merci de m'apporter vos lumi�res une fois de plus

  2. #2
    Sub
    Sub est d�connect�
    Membre averti
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    20
    D�tails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mars 2003
    Messages : 20
    Par d�faut
    Je ne sais pas si �a r�soudra le probl�me mais tu peux d�j� d�finir un constructeur pour ta classe combat parce que l� tu l'a juste d�clar�.

  3. #3
    Membre confirm�
    Inscrit en
    Avril 2007
    Messages
    82
    D�tails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 82
    Par d�faut
    Oui erreur de ma part lorsque j'ai recopi�
    c'est �dit� merci

  4. #4
    Membre �prouv�
    Avatar de NiamorH
    Inscrit en
    Juin 2002
    Messages
    1 309
    D�tails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 1 309
    Par d�faut
    Salut,

    si ta fonction est impl�ment�e dans la classe M�re Avion (l'affichage reste le m�me pour tous les avions) alors pas besoin de red�finir de m�thode dans les classes filles.

    Mais peut-�tre que les Avions de Combat ont besoin d'afficher des choses diff�rentes des Avions de Fret. Dans ce cas l�, tu peux utiliser le polymorphisme.

    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
    class Avion
    {
    /****/
    public:
      virtual void Affichage() = 0; // inutile de passer un avion en paramètre, on veut afficher seulement celui pour lequel on appelle la méthode.
    };
     
    class Combat : public Avion
    {
    /****/
    public:
      virtual void Affichage()
      {
        cout << "des trucs sur un avion combat" << endl;
      }
    };
    Peut-�tre aussi qu'une partie des caract�ristiques de nos avions sont communes � toutes les cat�gories d'avions. Dans ce cas l�, on peux d�finir la m�thode Affichage dans Avion pour les caract�ristiques communes � afficher, la red�finir dans la classe Combat pour les caract�ristiques sp�cialis�es et appeler la m�thode de base.

    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
    class Avion
    {
    /****/
    public:
      virtual void Affichage()
      {
        cout << "je suis un avion comme ça" << endl;
      }
    };
     
    class Combat : public Avion
    {
    /****/
    public:
      virtual void Affichage()
      {
        Avion::Affichage(); // appel à la main de la méthode parente
        cout << "mais aussi un avion de combat comme ceci" << endl;
      }
    };

  5. #5
    R�dacteur

    Avatar de millie
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    7 015
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 015
    Par d�faut
    Avion est une classe concr�te, ses filles doivent impl�menter toutes les m�thodes.

    De plus, une classe ne peut acc�der qu'� ses parents (donc Avion::Affichage(avion); est invalide �galement)

  6. #6
    Membre chevronn� Avatar de fenkys
    Profil pro
    Ing�nieur d�veloppement logiciels
    Inscrit en
    Octobre 2007
    Messages
    376
    D�tails du profil
    Informations personnelles :
    �ge : 58
    Localisation : France

    Informations professionnelles :
    Activit� : Ing�nieur d�veloppement logiciels
    Secteur : High Tech - Produits et services t�l�com et Internet

    Informations forums :
    Inscription : Octobre 2007
    Messages : 376
    Par d�faut
    Tu peux ommettre le mot clef virtual pour les fonctions membres des classes h�rit�es, mais pas pour le destructeur (parce le destructeur d'une classe n'est pas un membre h�rit�). Celui de F n'est pas virtual, d'ou ton message d'erreur.

    Dans la plupart des cas, quand tu as ce genre d'erreur, regarde le destructeur.

  7. #7
    Membre confirm�
    Inscrit en
    Avril 2007
    Messages
    82
    D�tails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 82
    Par d�faut
    Bonjour , merci pour vos r�ponses !
    j'ai refais les parties de code o� j'avais des problemes de facon plus rigoureuse suivant vos conseils , plus aucun probl�me !

    bonne journ�e � tous et merci encore

+ R�pondre � la discussion
Cette discussion est r�solue.

Discussions similaires

  1. Probl�me avec le mot cl� ESCAPE de DB2
    Par eros dans le forum DB2
    R�ponses: 1
    Dernier message: 22/11/2007, 17h10
  2. [IB5.3->FB2] probl�me avec des mots cl�s
    Par SergioMaster dans le forum Bases de donn�es
    R�ponses: 2
    Dernier message: 12/04/2007, 16h59

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