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 :

héritage et surcharge


Sujet :

Langage C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif

    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2011
    Messages
    685
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2011
    Messages : 685
    Par défaut héritage et surcharge
    Bonjour,

    J'ai une classe parente avec 2 méthodes setRect, prototype différent. Dansd une classe fille je surcharge l'une. Avec une instance de la classe fille j'appelle la méthode non surchargée de la parente, et j'ai une erreur 'method 'A' does not take 4 arguments'.

    Sauriez-vous pourquoi ?

    (je n'ai volontairement pas mis de code car je ne penses pas que cela soit nécessaire, mais si vous voulez un exemple concret dites le moi et je posterais cela)

  2. #2
    Membre émérite

    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    533
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 533
    Par défaut
    Peut-être un problème de masquage de fonction ?

  3. #3
    Membre très actif

    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2011
    Messages
    685
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2011
    Messages : 685
    Par défaut
    Effectivement ça a l'air d'être ça... ça veut dire qu'en surchargeant une méthode sur n définies (de même nom) dans la classe mère, je masque les n méthodes ? Pas top ça..

    Merci Cob59 et merci la FAQ dvp

    Je penses qu'on peut considérer le problème résolu.

  4. #4
    Membre très actif

    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2011
    Messages
    685
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2011
    Messages : 685
    Par défaut
    J'aimerais vraiment savoir si "ça veut dire qu'en surchargeant une méthode sur n définies (de même nom) dans la classe mère, je masque les n méthodes ?" est le comportement défini par la norme ou si c'est un "undefined behavior laissé à la guise des créateurs de compilo... vous avez une idée ?

  5. #5
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Citation Envoyé par Kaamui Voir le message
    J'aimerais vraiment savoir si "ça veut dire qu'en surchargeant une méthode sur n définies (de même nom) dans la classe mère, je masque les n méthodes ?" est le comportement défini par la norme ou si c'est un "undefined behavior laissé à la guise des créateurs de compilo... vous avez une idée ?
    Defini. A noter que c'est une question d'imbrication de portee et en rien propre aux classes, le meme comportement existe avec des namespaces et des blocs imbriques (mais pour les blocs, c'est rare car ceux qui s'amusent a y declarer des fonctions sont rares aussi).

  6. #6
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Salut,

    C'est un comportement parfaitement décrit dans la norme :

    Pour pouvoir surcharger une fonction, il faut:
    • qu'elle soit déclarée virtuelle
    • qu'elle présente exactement la même signature dans la classe dérivée que dans la classe de base.

    Si la fonction n'est pas déclarée virtuelle dans la classe de base, la norme précise qu'il y a "masquage" de la fonction de la classe de base.

    Si la signature n'est pas identique à celle qui se trouve dans la classe de base mais que la fonction de la classe de base est déclarée virtuelle, tu "rajoutes" simplement une fonction supplémentaire (de même nom mais avec des arguments différents). Au temps pour moi, j'ai dit une bêtise ici...

    Maintenant, on peut réellement se poser plusieurs questions :
    1. Pourquoi tiens tu à fournir un mutateur sur le rectangle sous-jacent à ta classe, au mépris de la loi de Déméter
    2. Pourquoi voudrais tu fournir à l'utilisateur la possibilité de modifier le rectangle sous-jacent sous une forme différente dans la classe dérivée
    La première question devrait t'inciter à considérer le niveau d'encapsulation de ta classe car, le simple fait de fournir un mutateur implique que les modifications du rectangle sous-jacent peuvent intervenir n'importe où et que tu laisses la responsabilité à l'utilisateur de ta classe de vérifier que le rectangle qu'il veut défini soit cohérent par rapport à ta classe.

    Cela n'ira pas sans poser un certain nombre de problèmes car toute décision susceptible de modifier la manière dont le rectangle sous-jacent est représenté dans ta classe impliquera de nombreux changements, sur lesquels tu n'as strictement aucun contrôle à l'heure actuelle.

    La deuxième question devrait t'inciter à réfléchir à l'intérêt réel qu'il y a à fournir, dans la classe dérivée uniquement, une possibilité supplémentaire d'appliquer le changement.

    Pourquoi rendre l'interface publique de ta classe dérivée plus inutilement plus complexe, alors que tu disposes déjà d'une solution pour appliquer le changement n'est-ce pas d'une certaine manière contrevenir à l'ISP (Interface Segregation Principle) qui te conseille de garder des interfaces les plus simples possibles Dans le pire des cas, pourquoi ne pas donner cette possibilité supplémentaire directement dans la classe de base Après tout, c'est bien elle qui prend la responsabilité de la gestion du rectangle sou-jacent... Pourquoi voudrais tu "l'amputer" d'une partie de cette responsabilité
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  7. #7
    Membre très actif

    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2011
    Messages
    685
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2011
    Messages : 685
    Par défaut
    J'ai une classe Qt qui contient deux méthodes setRect :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    void	setRect ( const QRectF & rect );
    void	setRect ( qreal x, qreal y, qreal width, qreal height );
    Ma classe dérivée doit effectuer une vérification avant d'appeler le sectRect parent...

    Je comprends parfaitement qu'il y ait masquage de fonction sur la fonction que j'ai redéfini puisque c'est ce que je voulais, mais je m'attendais pas à ce que l'autre fonction (non surchargée) soit elle aussi masquée.

    Certes dans mon cas précis ça m'a protégé (et tu viens de m'aider à me rendre compte qu'on a probablement pas respecté LSP puisque notre classe est censée représenter des ellipses ou des cercles (forme particulière d'ellipse)), mais dans d'autres cas ça pourrait être ennuyeux je trouve :/

    Le problème est qu'en l'occurence, Qt ne fournit pas de classe pour les cercles, donc je suis bien obligé de me rabbattre sur les ellipses pour gérer cette demande => donc obligé de surcharger setRect => donc étonné de voir qu'une surcharge masque les n fonction de même nom de la classe mère

  8. #8
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 766
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 766
    Par défaut
    Citation Envoyé par koala01 Voir le message
    Pour pouvoir surcharger une fonction, il faut:
    • qu'elle soit déclarée virtuelle
    • qu'elle présente exactement la même signature dans la classe dérivée que dans la classe de base.
    Tu confonds redéfinition et surcharge.

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 08/02/2008, 14h58
  2. [Problème] Héritage et surcharge
    Par kamykaze dans le forum C++
    Réponses: 8
    Dernier message: 13/11/2007, 14h18
  3. [POO] Héritage et surcharge de méthodes
    Par defkid dans le forum Langage
    Réponses: 4
    Dernier message: 26/02/2007, 14h51
  4. héritage et surcharge
    Par babar63 dans le forum C++
    Réponses: 7
    Dernier message: 17/01/2007, 23h23
  5. [G++] Héritage et surcharge de fonction
    Par Beuss dans le forum Autres éditeurs
    Réponses: 11
    Dernier message: 15/05/2006, 09h18

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