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. #1
    Membre éclairé
    Inscrit en
    Mai 2006
    Messages
    330
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 330
    Par défaut Peut-on interdire la dérivation d'une classe ?
    Je sais qu'en Java c'est possible mais en C++ ?

    Merci

  2. #2
    Modérateur
    Avatar de nouknouk
    Homme Profil pro
    Inscrit en
    Décembre 2006
    Messages
    1 655
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 655
    Par défaut
    Pas directement, mais tu peux jouer sur les constructeurs/destructeurs 'private' pour la rendre in-héritable dans les faits.

    Un article intéressant sur codeGuru.

  3. #3
    Membre extrêmement actif
    Profil pro
    Développeur Java Indépendant
    Inscrit en
    Mai 2007
    Messages
    1 333
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Java Indépendant

    Informations forums :
    Inscription : Mai 2007
    Messages : 1 333
    Par défaut
    Bonjour,

    A ce que j'ai cru comprendre, il faut mettre le constructeur en private, et faire une méthode static final* CreateInstance() qui renvoit une instance de la classe.
    Source : http://www.devx.com/tips/Tip/29062

  4. #4
    Rédacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supaéro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing Supaéro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Par défaut
    Citation Envoyé par tnarol Voir le message
    Je sais qu'en Java c'est possible mais en C++ ?

    Merci
    Intérêt ?
    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une très bonne doc sur le C++ (en) Why linux is better (fr)

  5. #5
    Membre très actif
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    432
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 432
    Par défaut
    Citation Envoyé par Davidbrcz Voir le message
    Intérêt ?
    Quitte a ne pas rendre une classe efficacement derivable avec un destructeur virtuel, autant empecher clairement l'heritage.

  6. #6
    Rédacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supaéro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing Supaéro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Par défaut
    Héritage n'équivaut pas à polymorphisme. Comment pouvez vous prévoir à l'avance ce que va devenir la classe une fois lachée dans la nature ?

    Ca me ferait chier de ne pas pouvoir faire un héritage privé pour réutiliser du code à cause de ce genre de manipulations foireuses.
    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une très bonne doc sur le C++ (en) Why linux is better (fr)

  7. #7
    Membre très actif
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    432
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 432
    Par défaut
    Si tu n'herite pas pour le polymorphisme, alors c'est plus ou moins pour forcer l'amitie avec cette classe, si ca c'est pas une manipulation foireuse... C'est clairement une faute d'un point de vue OO.

  8. #8
    Rédacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supaéro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing Supaéro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Par défaut
    Citation Envoyé par Ubiquité Voir le message
    Si tu n'herite pas pour le polymorphisme, alors c'est plus ou moins pour forcer l'amitie avec cette classe, si ca c'est pas une manipulation foireuse... C'est clairement une faute d'un point de vue OO.
    Nan, tu es dans l'optique héritage=polymorphisme (ce qui est faux).

    Tu peux utiliser un héritage privé pour réutiliser du code (c'est une alternative à la composition) ou l'héritage protected (je n'ai pas d'exemple réel mais je me rappelle que Luc en avait croisé un).
    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une très bonne doc sur le C++ (en) Why linux is better (fr)

  9. #9
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    F.A.Q. : Pourquoi mettre en œuvre un héritage ?

    L'intérêt d'interdire l'héritage ? Forcer à la composition si on veut bénéficier de l'implémentation. Mais, j'avoue que je ne vois pas de cas immédiat d'utilité.

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

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Par défaut
    Citation Envoyé par 3DArchi Voir le message
    F.A.Q. : Pourquoi mettre en œuvre un héritage ?

    L'intérêt d'interdire l'héritage ? Forcer à la composition si on veut bénéficier de l'implémentation. Mais, j'avoue que je ne vois pas de cas immédiat d'utilité.
    Je préfére laisser le choix perso... J'ai tendance à privilégier la compositions quand je réutilise des composants quoi, mais tout le monde a pas forcément la même approche. Donc autant laisser la liberté, même si ça permet de se tirer une balle dans le pied. (ça se rapproche du dilemme des templates, ceux qui veulent restreindre à certains types).

  11. #11
    Membre éclairé
    Inscrit en
    Mai 2006
    Messages
    330
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 330
    Par défaut
    Citation Envoyé par 3DArchi Voir le message
    L'intérêt d'interdire l'héritage ?
    Je ne sais pas non plus à vrai dire. C'était une question de test professionnel à laquelle j'ai répondu que je ne voyais pas trop l'intérêt et que la seule manière que je voyais était de rendre le constructeur privé en ayant une méthode publique de construction.

    Apparemment la question était un peu stupide mais je n'en était pas sûr étant donné qu'il y a un mot clé "final" fait spécialement pour ça en Java, je me suis dit qu'il pourrait y avoir une bonne raison.

  12. #12
    Membre extrêmement actif
    Profil pro
    Développeur Java Indépendant
    Inscrit en
    Mai 2007
    Messages
    1 333
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Java Indépendant

    Informations forums :
    Inscription : Mai 2007
    Messages : 1 333
    Par défaut
    Citation Envoyé par 3DArchi Voir le message
    F.A.Q. : Pourquoi mettre en œuvre un héritage ?

    L'intérêt d'interdire l'héritage ? Forcer à la composition si on veut bénéficier de l'implémentation. Mais, j'avoue que je ne vois pas de cas immédiat d'utilité.
    Si on veux garantir le comportement d'un élément, par exemple dans une api.
    En java les objets String par exemple ne sont pas dérivable ça permet de pouvoir faire confiance au comportement d'un objet.
    C'est ce que j'en ai compris.

  13. #13
    Rédacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supaéro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing Supaéro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Par défaut
    Citation Envoyé par Herve-Loiret Voir le message
    Si on veux garantir le comportement d'un élément, par exemple dans une api.

    En java les objets String par exemple ne sont pas dérivable ça permet de pouvoir faire confiance au comportement d'un objet.

    C'est ce que j'en ai compris.
    Oui mais en C++ tout est statique par défaut, alors qu'en Java tout est dynamique.

    Même si tu dérives std::string (ce qui n'est pas conseillé), et que tu passes ta classe dérivée à la place d'une std::string, tu sera sûr du résultat car aucune fonction n'est virtuelle dans std::string, ca sera donc les fonctions de std::string qui seront appelées.

    Le C++ offre le moyen de rendre dynamique (fonctions virtuelles) mais pas de finaliser. Le Java offre le moyen de finaliser mais pas de rendre "statique" (pas au sens fonction membre statique, au sens non-dynamique).

    2 approches différentes avec chacun des cotés des arguments (je reste neutre en ne disant pas ce que je pense de Java )
    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une très bonne doc sur le C++ (en) Why linux is better (fr)

  14. #14
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 288
    Billets dans le blog
    2
    Par défaut
    Je ne suis pas sûr, mais je pense qu'il doit y avoir des cas où il peut être intéressant d'interdire l'héritage. Par exemple, lorsqu'on a d'énormes contraintes de rapidité d'exécution et de mémoire utilisée, on aime pouvoir se passer d'une vtable pour des objets simples, donc aucune fonction virtuelle, donc pas de destructeur virtuel, donc, si on veut faire ça bien, on interdit d'en hériter pour éviter toute mauvaise utilisation. D'autant plus que parfois, on sait très bien qu'une classe ne sera jamais héritée.

    J'ai du mal à trouver un bon exemple, mais si des gens se sont posé la question, c'est qu'il doit y avoir une raison

  15. #15
    Rédacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supaéro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing Supaéro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Par défaut
    Citation Envoyé par r0d Voir le message
    Je ne suis pas sûr, mais je pense qu'il doit y avoir des cas où il peut être intéressant d'interdire l'héritage. Par exemple, lorsqu'on a d'énormes contraintes de rapidité d'exécution et de mémoire utilisée, on aime pouvoir se passer d'une vtable pour des objets simples, donc aucune fonction virtuelle, donc pas de destructeur virtuel, donc, si on veut faire ça bien, on interdit d'en hériter pour éviter toute mauvaise utilisation. D'autant plus que parfois, on sait très bien qu'une classe ne sera jamais héritée.
    Ok, mais en échange tu te mange un surcout à chaque construction, tes objets ne sont plus stockable dans un vecteur, ....
    Citation Envoyé par r0d Voir le message
    J'ai du mal à trouver un bon exemple, mais si des gens se sont posé la question, c'est qu'il doit y avoir une raison
    Pas forcément
    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une très bonne doc sur le C++ (en) Why linux is better (fr)

  16. #16
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Mais ça, c'est seulement parce qu'on n'a pas de moyen en C++ d'interdire l'héritage sans rendre le constructeur privé. S'il y avait, on pourrait interdire l'héritage sans rendre obligatoire l'allocation dynamique...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  17. #17
    screetch
    Invité(e)
    Par défaut
    interdire la dérivation est pour moi un moyen d'interdire l'extensibilité du code par ce moyen. ca fait partie de l'API, en quelque sorte, de la facon dont il faut utiliser la bibliotheque.
    c'est la raison pour laquelle j'utilise friend aussi, et que je déclare quelques classes en amies, ca veut dire que les autres classes ne sont *pas* censées utiliser cette classe. et si je souhaite que l'on ne dérive pas de cette classe, j'aimerai pouvoir le faire
    Dernière modification par screetch ; 02/11/2009 à 18h41.

  18. #18
    Membre Expert
    Avatar de Klaim
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2004
    Messages
    1 717
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 717
    Par défaut
    Personellement, je préfère utiliser friend uniquement quand le comportement de l'instance de la classe est définie par plusieurs classes/fonctions externes.

    Utiliser friend pour indiquer les classes a ne pas utiliser me semble une convention un poil fragile non?

  19. #19
    screetch
    Invité(e)
    Par défaut
    friend sert a donner l'acces a un nombre (fini) d'autres classes, si l'utilisateur se pointe avec son code crados (j'exagere bien sur hein, mais disons qu'il veut bidouiller un truc dans l'interface) il ne peut pas car ses classes ne sont pas amies. l'acces est bien interdit.

  20. #20
    Membre chevronné 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
    Par défaut
    Je suis pas trop pour ce genre d'approche. Lorsque qu'on fourni une api, on fourni aussi une doc, en mentionnant que l'héritage doit être éviter par exemple.

    Mais l'interdire, ça veux aussi un peu dire : "non, je sais mieux ce qu'il faut pour toi que toi !"

    Je suis d'accord pour repousser les erreur du runtime à la compilation, mais je vois pas l'intérêt d'un fournisseur d'api de repousser les erreurs de conception à la compilation...

    Et la possibilité de bidouiller une interface presque bien pensée pour un problème donné, je trouve que ça fait un peux partie des charmes du C++ (contrairement à d'autre langage OO que j'apprécie moins ).

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