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 :

Interdire la redéfinition d'une fonction


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Profil pro
    Inscrit en
    Février 2004
    Messages
    1 825
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 1 825
    Par défaut Interdire la redéfinition d'une fonction
    Bonjour à tous,

    Je connais les méthodes virtuelles pure, mais par contre j'ai aucune idée de comment représenter l'inverse, à savoir, interdire la redéfinition d'une méthode.

    Exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    class a
    {
        void f();
    }
     
    class a2
    {
        void f();
    }
    Comment générer un message du compilateur du style "La classe a a interdit de redéfinit la fonction f()"?

    Merci,

    A bientôt

  2. #2
    Membre expérimenté
    Avatar de David Fleury
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    253
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 253
    Par défaut
    souvent dans ces cas là, on demande : pourquoi faire ?

  3. #3
    Inactif  

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

    Informations forums :
    Inscription : Décembre 2002
    Messages : 534
    Par défaut
    Salut,

    Franchement je ne vois pas l'intérêt. A la limite on peut masquer une méthode dans une dérivation de classe, avec un truc un peu scabreux du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    class A
    {
       public :
       void f() ;
    };
     
    class B : public A 
    {  private :
        void f() ; 
        public:
     
    };
    Mais c'est pas terrible ...

  4. #4
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 296
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 296
    Par défaut
    Si tu veux interdire la redéfinition (aka overriding, le truc qui supplante), il faut commencer par ne pas rendre la fonction virtuelle.
    Ce qui n'empêchera pas la surcharge éventuellement masquante (si tu oublies le using)
    Si tu veux interdire la surcharge, il te faudra interdire la dérivation.

    Mais comme l'ont très bien dit dj.motte et Hylvénir: "je ne vois pas l'intérêt". C'est vrai quoi. "Pourquoi faire ?"

    Il est vrai qu'il est bon de se protéger contre certaines erreurs d'étourderie (comme les copies incompatibles avec la sémantique, ou nos ressources), mais on ne peut pas tout contrôler. Si tes collègues/clients dérivent sans connaitre les tenants et aboutissants de la dérivation, tu n'y peux rien -- à part leur facturer une formation que tu vas leur donner.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  5. #5
    Membre éprouvé
    Profil pro
    Inscrit en
    Février 2004
    Messages
    1 825
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 1 825
    Par défaut
    Ok, merci beaucoup,

    A la base, c'est parceque je fais des exceptions qui dérivent d'une classe CException à moi. Chaque exceptions redéfinissaient la fonction What pour renvoyer le message.

    Mais au fur et à mesure, la construction des messages de retour devenaient longue et contraignante et surtout, pour être homogène, il fallait faire en sorte d'avoir un affichage commun lorsque celui-ci intègre des causes possibles ainsi que plusieurs données nécessaires pour régler le problème.

    Donc je me suis dit que ça serai pas mal, dans ma classe d'exception de base, de mettre un message qui serait par défaut dans les constructeurs des exceptions dérivées, et de proposer d'enrichir une liste de cause et une liste de paramètres.

    Ainsi, au lieu de s'embêter à formatter un jolie message, on a juste à mettre un message de base, genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    CFileAccessException e("Impossible d'accéder au fichier")
    e.AddCause("Le fichier n'existe pas");
    e.AddCause("Vous n'avez pas les droits d'y accéder");
    e.AddParam("Fichier", m_sFilename);
    Quant au message, c'est la fonction What() de la classe de base qui le formatterai avec le message en dur ainsi que les causes et les paramètres:

    Impossible d'accéder au fichier.
    Cause(s):
    - Le fichier n'existe pas
    - Vous n'avez pas les droits d'y accéder
    Informations:
    - Fichier : Config.ini
    Alors principalement, c'était pour ne pas repasser toutes les exceptions pour retirer la méthode What(), mais bloquer la redéfinition dans la classe de base et me laisser guider par les erreurs du compilateur (car j'en ai un paquet d'exceptions).
    C'est également pour éviter de faire des erreurs par la suite.

    Merci beaucoup

  6. #6
    Expert confirmé

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Billets dans le blog
    3
    Par défaut
    Ca m'étonnerai que l'IDE ne propose pas une fonction de refactoring adéquate pour ce genre de choses...

    Sinon, Une idée... comme ça. J'imagine que ta fonction est "virtuelle" (sinon je vois pas trop ou est l'interêt), donc:
    tu changes la valeur de retour de la fonction dans la classe de base, et tu vas récupérer un tas de warning (ou d'erreur, c'est selon) de compilateur te disant que la fonction n'a pas la même signature de retour dans telle ou telle class dérivée.

    Au passage tu peux rendre aussi la méthode privée.

Discussions similaires

  1. [UI] Redéfinition d'une fonction
    Par Tony_ducrocq dans le forum jQuery
    Réponses: 2
    Dernier message: 27/08/2012, 14h11
  2. Réponses: 14
    Dernier message: 18/07/2011, 21h00
  3. Limiter la redéfinition d'une fonction virtuelle ?
    Par N0vember dans le forum Débuter
    Réponses: 5
    Dernier message: 30/11/2009, 09h58
  4. Réponses: 5
    Dernier message: 27/01/2009, 10h46
  5. Réponses: 7
    Dernier message: 05/05/2006, 09h48

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