J'apprends le java en ce moment et il est possible dans ce langage de
definir une class de type "final" pour eviter l'heritage (pour que la
class definit ainsi ne puisse pas avoir de descendance).
J'ai cherché a créer une telle class en C++ et je n'y arrive pas,
quelqu'un aurais t'il une idée de la manière de procéder ?
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
Fabien LE LEZ
On Tue, 01 Mar 2005 22:45:34 +0100, Cloporte :
J'apprends le java en ce moment et il est possible dans ce langage de definir une class de type "final" pour eviter l'heritage (pour que la class definit ainsi ne puisse pas avoir de descendance).
C'est pas possible en C++. Du moins, pas directement.
Il y a deux méthodes principales pour gérer le problème :
- Ne pas mettre de destructeur virtuel - Indiquer, dans la documentation de la classe, qu'il ne faut pas en dériver.
Cf aussi <http://www.google.com/advanced_group_search>, et notamment <http://groups-beta.google.com/group/fr.comp.lang.c++/browse_frm/thread/e3d7cc2d048ec07d/77661ee84bb74112?q=%22empecher+l%27heritage%22+group:fr.comp.lang.c%2B%2B&_done=%2Fgroups%3Fas_epq%3Dempecher+l%27heritage%26safe%3Dimages%26as_ugroup%3Dfr.comp.lang.c%2B%2B%26lr%3D%26hl%3Den%26&_doneTitleºck+to+Search&&d#77661ee84bb74112>
-- ;-)
On Tue, 01 Mar 2005 22:45:34 +0100, Cloporte <kyomi@free.fr>:
J'apprends le java en ce moment et il est possible dans ce langage de
definir une class de type "final" pour eviter l'heritage (pour que la
class definit ainsi ne puisse pas avoir de descendance).
C'est pas possible en C++. Du moins, pas directement.
Il y a deux méthodes principales pour gérer le problème :
- Ne pas mettre de destructeur virtuel
- Indiquer, dans la documentation de la classe, qu'il ne faut pas en
dériver.
Cf aussi <http://www.google.com/advanced_group_search>, et notamment
<http://groups-beta.google.com/group/fr.comp.lang.c++/browse_frm/thread/e3d7cc2d048ec07d/77661ee84bb74112?q=%22empecher+l%27heritage%22+group:fr.comp.lang.c%2B%2B&_done=%2Fgroups%3Fas_epq%3Dempecher+l%27heritage%26safe%3Dimages%26as_ugroup%3Dfr.comp.lang.c%2B%2B%26lr%3D%26hl%3Den%26&_doneTitleºck+to+Search&&d#77661ee84bb74112>
J'apprends le java en ce moment et il est possible dans ce langage de definir une class de type "final" pour eviter l'heritage (pour que la class definit ainsi ne puisse pas avoir de descendance).
C'est pas possible en C++. Du moins, pas directement.
Il y a deux méthodes principales pour gérer le problème :
- Ne pas mettre de destructeur virtuel - Indiquer, dans la documentation de la classe, qu'il ne faut pas en dériver.
Cf aussi <http://www.google.com/advanced_group_search>, et notamment <http://groups-beta.google.com/group/fr.comp.lang.c++/browse_frm/thread/e3d7cc2d048ec07d/77661ee84bb74112?q=%22empecher+l%27heritage%22+group:fr.comp.lang.c%2B%2B&_done=%2Fgroups%3Fas_epq%3Dempecher+l%27heritage%26safe%3Dimages%26as_ugroup%3Dfr.comp.lang.c%2B%2B%26lr%3D%26hl%3Den%26&_doneTitleºck+to+Search&&d#77661ee84bb74112>
-- ;-)
kanze
Fabien LE LEZ wrote:
On Tue, 01 Mar 2005 22:45:34 +0100, Cloporte :
J'apprends le java en ce moment et il est possible dans ce langage de definir une class de type "final" pour eviter l'heritage (pour que la class definit ainsi ne puisse pas avoir de descendance).
C'est pas possible en C++.
Il y a toujours la solution classique :
template< typename C > class BloquerLHeritage { friend class C ; BloquerLHeritage() {} BloquerLHeritage( BloquerLHeritage const& ) {} } ;
Effectivement, ce n'est pas ce que j'appellerais très direct.
Il y a deux méthodes principales pour gérer le problème :
- Ne pas mettre de destructeur virtuel
Comme dans std::iterator ?
- Indiquer, dans la documentation de la classe, qu'il ne faut pas en dériver.
Je crois que le consensus, c'est plutôt que ce n'est pas forcement une bonne idée de vouloir bloquer l'héritage ; que l'héritage, en tant que technique C++ (et technique Java !) peut servir à implémenter beaucoup de conceptes distincts, et que s'il peut bien être raisonable de vouloir ne pas permettre l'héritage polymorphique, il n'est pas raisonable de vouloir bloquer toutes les utilisations possibles de l'héritage.
Note qu'en Java, déclarer une classe final, et ne lui donner aucune fonction mutante, c'est l'idiome classiqeu d'implémenter une classe à sémantique de valeur. Dans ce cas-là, je dirais que l'importance de « final », ce n'est pas tant l'impossibilité d'hériter (qui est plutôt un défaut), mais le message au l'utilisateur, qu'il s'agit d'une classe à sémantique de valeur. En C++, évidemment, l'équivalent, c'est de donner un constructeur de copie et un opérateur d'affectation publics à la classe. Ou plutôt, de ne pas déclarer l'opérateur d'affectation privé, étant donné que le C++ a une sémantique de valeur par défaut.
-- James Kanze GABI Software Conseils en informatique orientée objet/ Beratung in objektorientierter Datenverarbeitung 9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34
Fabien LE LEZ wrote:
On Tue, 01 Mar 2005 22:45:34 +0100, Cloporte <kyomi@free.fr>:
J'apprends le java en ce moment et il est possible dans ce
langage de definir une class de type "final" pour eviter
l'heritage (pour que la class definit ainsi ne puisse pas
avoir de descendance).
C'est pas possible en C++.
Il y a toujours la solution classique :
template< typename C >
class BloquerLHeritage
{
friend class C ;
BloquerLHeritage() {}
BloquerLHeritage( BloquerLHeritage const& ) {}
} ;
Effectivement, ce n'est pas ce que j'appellerais très direct.
Il y a deux méthodes principales pour gérer le problème :
- Ne pas mettre de destructeur virtuel
Comme dans std::iterator ?
- Indiquer, dans la documentation de la classe, qu'il ne faut pas en
dériver.
Je crois que le consensus, c'est plutôt que ce n'est pas
forcement une bonne idée de vouloir bloquer l'héritage ; que
l'héritage, en tant que technique C++ (et technique Java !) peut
servir à implémenter beaucoup de conceptes distincts, et que
s'il peut bien être raisonable de vouloir ne pas permettre
l'héritage polymorphique, il n'est pas raisonable de vouloir
bloquer toutes les utilisations possibles de l'héritage.
Note qu'en Java, déclarer une classe final, et ne lui donner
aucune fonction mutante, c'est l'idiome classiqeu d'implémenter
une classe à sémantique de valeur. Dans ce cas-là, je dirais que
l'importance de « final », ce n'est pas tant l'impossibilité
d'hériter (qui est plutôt un défaut), mais le message au
l'utilisateur, qu'il s'agit d'une classe à sémantique de valeur.
En C++, évidemment, l'équivalent, c'est de donner un
constructeur de copie et un opérateur d'affectation publics à la
classe. Ou plutôt, de ne pas déclarer l'opérateur d'affectation
privé, étant donné que le C++ a une sémantique de valeur par
défaut.
--
James Kanze GABI Software
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34
J'apprends le java en ce moment et il est possible dans ce langage de definir une class de type "final" pour eviter l'heritage (pour que la class definit ainsi ne puisse pas avoir de descendance).
C'est pas possible en C++.
Il y a toujours la solution classique :
template< typename C > class BloquerLHeritage { friend class C ; BloquerLHeritage() {} BloquerLHeritage( BloquerLHeritage const& ) {} } ;
Effectivement, ce n'est pas ce que j'appellerais très direct.
Il y a deux méthodes principales pour gérer le problème :
- Ne pas mettre de destructeur virtuel
Comme dans std::iterator ?
- Indiquer, dans la documentation de la classe, qu'il ne faut pas en dériver.
Je crois que le consensus, c'est plutôt que ce n'est pas forcement une bonne idée de vouloir bloquer l'héritage ; que l'héritage, en tant que technique C++ (et technique Java !) peut servir à implémenter beaucoup de conceptes distincts, et que s'il peut bien être raisonable de vouloir ne pas permettre l'héritage polymorphique, il n'est pas raisonable de vouloir bloquer toutes les utilisations possibles de l'héritage.
Note qu'en Java, déclarer une classe final, et ne lui donner aucune fonction mutante, c'est l'idiome classiqeu d'implémenter une classe à sémantique de valeur. Dans ce cas-là, je dirais que l'importance de « final », ce n'est pas tant l'impossibilité d'hériter (qui est plutôt un défaut), mais le message au l'utilisateur, qu'il s'agit d'une classe à sémantique de valeur. En C++, évidemment, l'équivalent, c'est de donner un constructeur de copie et un opérateur d'affectation publics à la classe. Ou plutôt, de ne pas déclarer l'opérateur d'affectation privé, étant donné que le C++ a une sémantique de valeur par défaut.
-- James Kanze GABI Software Conseils en informatique orientée objet/ Beratung in objektorientierter Datenverarbeitung 9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34