OVH Cloud OVH Cloud

un class de type "final" en C++.

3 réponses
Avatar
Cloporte
Bonjour,

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 ?


Kyomi.

3 réponses

Avatar
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>


--
;-)

Avatar
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& ) {}
} ;

class HeritageBloque
: private virtual BloquerLHeritage< HeritageBloque >
{
} ;

Du moins, pas directement.


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


Avatar
Cloporte
Merci beaucoup pour ces reponses.

Kyomi -