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 :

[POO] Héritage, fonctions virtuelles


Sujet :

C++

  1. #1
    Membre régulier
    Étudiant
    Inscrit en
    Mars 2007
    Messages
    163
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2007
    Messages : 163
    Points : 76
    Points
    76
    Par défaut [POO] Héritage, fonctions virtuelles
    Re Bonjour à tous, mes questions sont nombreuses. Je suis entrain d'appronfondire mes connaissances en C++. Comme je l'ai dit dans l'un de mes précident postes: j'ai deux classes mère "FileSelection" et fille "H5FileSelection".

    Afin d'utiliser le polymorphisme: j'ecris:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    //Dans la classe mère
    File* filePointer;
    virtual FILE* getFilePointer() {return filePointer;}
    Puis:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    //Dans la classe fille
    H5File* H5filePointer;
    virtual H5File* getFilePointer() {return H5filePointer;}
    A la compilation, j'ai cette erreur:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    "H5FileSelection.h", line 35.25: 1540-1168 (S) The virtual function 
    "H5::H5File *H5FileSelection::getFilePointer()" is not a valid override because 
    "_IO_FILE" is not a base class of "H5File".
    Je ne comprends ce message d'erreur. Ma classe mere hérite à son tour d'un autre classe ("Grand mere").

    Merci à vous.
    mamid

  2. #2
    Membre actif Avatar de Rupella
    Inscrit en
    Février 2005
    Messages
    286
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 286
    Points : 257
    Points
    257
    Par défaut
    IL faudrait que la fonction dans la classe fille retourne un FILE *. Pour cela, elle devrait manipuler le H5FilePointer pour le transformer en FILE *.

    Il faut que les fonctions aient exactement la même signature pour qu'elles soient surchargées

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    577
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 577
    Points : 256
    Points
    256
    Par défaut
    heu je pense que c'est une erreur de copier / coller, mais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    File* filePointer;
    virtual FILE* getFilePointer() {return filePointer;}
    File* <> FILE*

  4. #4
    Membre actif
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    433
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 433
    Points : 240
    Points
    240
    Par défaut
    Citation Envoyé par Rupella
    Il faut que les fonctions aient exactement la même signature pour qu'elles soient surchargées
    Je croyais que le type retourné ne fesait pas parti de la signature d'une fonction ?

    Pour moi, la signature est constituée:
    - du nombre d'argument
    - du type des arguments
    - de l'ordre des arguments

    Mais pas du type retourné, je me trompe ?

  5. #5
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Citation Envoyé par FabaCoeur
    Je croyais que le type retourné ne fesait pas parti de la signature d'une fonction ?
    Effectivement.

    Mais pour supplanter (ce qui est différent de surcharger, surcharger c'est la possibilité d'avoir plusieurs fonctions avec le même nom et des signatures différentes) une fonction, il faut non seulement que la signature soit la même, il faut aussi que le type retourné soit le même (ou un descendant auquel cas on parle de retour covariant).
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  6. #6
    Membre régulier
    Étudiant
    Inscrit en
    Mars 2007
    Messages
    163
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2007
    Messages : 163
    Points : 76
    Points
    76
    Par défaut
    Merci de vos nombreuses réponses!!

    Donc, si je comprends bien, il n y a pas de solution possible (avoir un redifinition sur une fonction qui ne retourne pas le même type dans la classe mère et fille)?

    Il y a-t-il un moyen pour contourner le problème?
    mamid

  7. #7
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Citation Envoyé par mamid1706
    Donc, si je comprends bien, il n y a pas de solution possible (avoir un redifinition sur une fonction qui ne retourne pas le même type dans la classe mère et fille)?
    Sauf si le membre de la classe fille retourne un descendant du type retourne par le membre de la classe mere, tu ne peux pas supplanter en effet.

    Comment voudrais-tu l'utiliser -- que se passe-t'il si le membre est appele avec pour type dynamique la classe fille et pour type statique la classe mere?

    Vocabulaire: redefinir, supplanter et surchager sont trois choses differentes.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    struct M {
      int f();      // 1
      int f(int);  // 2
      virtual int f(double); // 3
    };
     
    struct F: M {
      int f(int); // 4
      int f(double); // 5
    };
    Les fonctions declarees en 1, 2, 3 se surchargent l'une autre (meme nom, different prototype). La fonction declaree en 4 redefini la fonction declaree en 2. La fonction declaree en 5 supplante celle declaree en 3. De plus les fonctions declarees en 4 et 5 cachent la fonction declaree en 1.
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  8. #8
    Membre régulier
    Étudiant
    Inscrit en
    Mars 2007
    Messages
    163
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2007
    Messages : 163
    Points : 76
    Points
    76
    Par défaut
    Pour contourner mon problème, j'ai fait les modifications suivantes. j'ai enlevé la méthode getFilePointer() dans la classe fille en la remplaçant par getH5FilePointer(). j'ai ajouté aussi une méthode virtuelle qui retourne le même type dans les deux classes "isH5File()" comme vous pouvez le voir ci-dessous:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    //Dans la classe mère FileSelection
    FILE* filePointer;
    virtual FILE* getFilePointer() {return filePointer;}
    virtual boolean isH5File() {return false;}
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    //Dans la classe fille
    H5File* H5filePointer;
    virtual H5File* getH5FilePointer() {return H5filePointer;}
    virtual boolean isH5File() {return true;}
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    /* Dans une autre classe, selon l'objet réel, elle fait appel soit à 
    35:getFilePointer() soit à getH5FilePointer() */
    36:if (! getFileSelectionPointer()->isH5File()){
    37:  	UneFonction(getFileSelectionPointer()->getFilePointer());
    38:  	fclose(getFileSelectionPointer()->getFilePointer());
    39:  }else{
    40:  	uneFonction(getFileSelectionPointer()->getH5FilePointer());
    41:  	delete(getFileSelectionPointer()->getFilePointer());
    42: }
    La signature de la fonction UneFonction est:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    UneFonction(FILE *file_pointer);
    UneFonction(H5File *file_pointer);
    Mais, malheureusement, là encore j'ai une erreur:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    line 40.90: 1540-0217 (S) "getH5FilePointer" is not a member of 
    "class FileSelection".
    Pour moi l'objet de type classe fille est aussi de type mère.

    Merci de votre aide.
    mamid

  9. #9
    Membre régulier
    Étudiant
    Inscrit en
    Mars 2007
    Messages
    163
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2007
    Messages : 163
    Points : 76
    Points
    76
    Par défaut
    J'ai réussi à le faire marcher. J'ai trouvé une solution bricolage, amais c'est une solution quand même. Cependant, je reste ouvert pour toute autre solution. Ce que j'ai fait c'est que dans la classe mère, j'ai aujouté la méthode getH5File()

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    virtual H5File* getH5FilePointer() {return NULL;}
    Et ça marche apparement.
    Je vous remercie à tous.surtout pour la nuance entre redefinir, supplanter.
    mamid

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

Discussions similaires

  1. Héritage, fonction virtuelle, redefinition et thread
    Par contremaitre dans le forum Threads & Processus
    Réponses: 12
    Dernier message: 26/08/2008, 12h50
  2. [POO] Fonctions virtuelles et performances
    Par poukill dans le forum C++
    Réponses: 4
    Dernier message: 06/12/2007, 18h42
  3. Réponses: 8
    Dernier message: 18/06/2007, 15h06
  4. Réponses: 16
    Dernier message: 21/05/2007, 01h04
  5. Réponses: 2
    Dernier message: 29/03/2007, 12h02

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