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 :

Peut-on interdire la dérivation d'une classe ?


Sujet :

Langage C++

  1. #21
    Membre chevronné
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Points : 2 205
    Points
    2 205
    Par défaut
    Sa rejoint plus ou moins ce que j'avais dis, restons dans la philosophie du C++, si l'utilisateur veut se tirer une balle dans le pied et s'en resservir après, alors grand bien lui fasse.
    Sinon on finit comme d'autre langages où on croit le développeur trop bête pour savoir développer par lui même.
    "Hardcoded types are to generic code what magic constants are to regular code." --A. Alexandrescu

  2. #22
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 275
    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 275
    Points : 10 985
    Points
    10 985
    Par défaut
    L'héritage du Java est un héritage qui tire la substituabilité. Impossible d'hériter dans un but d'importation de code pur. Seule la composition remplit ce rôle en Java.

    En C++, hériter publiquement d'un truc qui n'a pas été prévu pour finit toujours par introduire des problèmes. Donc on documente que la classe va par exemple avoir une sémantique de valeur (chose que Java ne sait pas supporter simplement; cf leurs prises de tête avec equals()).

    En C++, la seule façon d'interdire l'héritage est de jouer avec une classe de base virtuelle. Ce qui tire une vtble. (les hacks à base de T::createIntance() sont tout pourris car ils bloquent les créations sur la pile simples, or c'est pour les classes à sémantique de valeur qu'il est important d'interdire l'héritage public)

    Bref, écrire en gros : cette classe n'est pas faite pour être héritée publiquement, c'est bien.

    PS: pour l'héritage protégé, j'avais lu un truc à ce sujet dans un article/blog d'un type qui bossait sur Qt.
    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...

  3. #23
    Membre averti
    Profil pro
    professeur des universités à la retraite
    Inscrit en
    Août 2008
    Messages
    364
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : professeur des universités à la retraite

    Informations forums :
    Inscription : Août 2008
    Messages : 364
    Points : 439
    Points
    439
    Par défaut
    Il me semble que cet article - qui a été signalé dès les premiers messages - est très intéressant et contient à peu près toutes les idées qui ont été émises ensuite dans ce fil (et montre aussi que certaines d'entre elles sont erronées) :
    http://www.codeguru.com/cpp/cpp/cpp_...cle.php/c4143/
    qu'en pensez-vous ?

  4. #24
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    780
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2006
    Messages : 780
    Points : 1 176
    Points
    1 176
    Par défaut
    En tout cas ça marche pas trop si on veut empêcher l'héritage pour des raisons de performances ou de taille.

    Sinon un commentaire dans le header et un destructeur non virtuel c'est bien aussi.

  5. #25
    screetch
    Invité(e)
    Par défaut
    Citation Envoyé par Lavock Voir le message
    ... je vois pas l'intérêt d'un fournisseur d'api de repousser les erreurs de conception à la compilation...
    moi c'est exactement ce que je veux faire.

  6. #26
    Membre averti
    Profil pro
    professeur des universités à la retraite
    Inscrit en
    Août 2008
    Messages
    364
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : professeur des universités à la retraite

    Informations forums :
    Inscription : Août 2008
    Messages : 364
    Points : 439
    Points
    439
    Par défaut
    Eh bien, peut-être m'étais-je enthousiasmé un peu vite à propos de l'article donné plus haut par nouknouk
    http://www.codeguru.com/cpp/cpp/cpp_...cle.php/c4143/

    La solution ultime proposée par l'auteur, est, si je ne me trompe :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    template <typename  T>
    class MakeFinal
    {
    private:
      ~MakeFinal() { };
      friend  T;
    };
     
    class FinalClass : virtual public MakeFinal<FinalClass>
    {
    };
    mais en définitive chez moi sous g++ ça ne compile pas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    example.cpp:6: error: a class-key must be used
    when declaring a friend
    example.cpp:6: error: friend declaration does not 
    name a class or function


  7. #27
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 275
    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 275
    Points : 10 985
    Points
    10 985
    Par défaut
    J'avais posté un code qui marche il y a longtemps -- mais je n'ai pas réussi à le retrouver.
    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...

  8. #28
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 275
    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 275
    Points : 10 985
    Points
    10 985
    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...

  9. #29
    Membre confirmé Avatar de Lavock
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    560
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 560
    Points : 633
    Points
    633
    Par défaut
    Citation Envoyé par ptyxs Voir le message
    Eh bien, peut-être m'étais-je enthousiasmé un peu vite à propos de l'article donné plus haut par nouknouk
    http://www.codeguru.com/cpp/cpp/cpp_...cle.php/c4143/

    La solution ultime proposée par l'auteur, est, si je ne me trompe :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    template <typename  T>
    class MakeFinal
    {
    private:
      ~MakeFinal() { };
      friend  T;
    };
     
    class FinalClass : virtual public MakeFinal<FinalClass>
    {
    };
    mais en définitive chez moi sous g++ ça ne compile pas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    example.cpp:6: error: a class-key must be used
    when declaring a friend
    example.cpp:6: error: friend declaration does not 
    name a class or function

    As-tu essaye ou encore
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     typename friend [class] T;
    ? Dans tous les cas, il faut soit n'allouer que sur le tas, soit se trainer une vtable...
    The mark of the immature man is that he wants to die nobly for a cause, while the mark of the mature man is that he wants to live humbly for one.
    --Wilhelm Stekel

  10. #30
    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
    Il faut attendre C++0X pour pouvoir rendre friend un parametre template.
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

Discussions similaires

  1. [MySQL 5]Peut-on interdire l'écriture sur une seule table?
    Par *.Har(d)t dans le forum Requêtes
    Réponses: 3
    Dernier message: 05/08/2009, 16h41
  2. L'employeur peut-il interdire l'accès à Facebook ? Une salariée d'Agfa licenciée
    Par Pierre Louis Chevalier dans le forum Droit du travail
    Réponses: 7
    Dernier message: 23/06/2009, 19h49
  3. Réponses: 0
    Dernier message: 21/06/2009, 08h55
  4. Réponses: 1
    Dernier message: 05/01/2007, 14h00
  5. Réponses: 2
    Dernier message: 27/03/2005, 16h09

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