OVH Cloud OVH Cloud

Déclaration d'une classe sealed

34 réponses
Avatar
nico
Bonjour,

Comment déclarer une classe indérivable en C++ ?

Merci.

--
nico

10 réponses

1 2 3 4
Avatar
Fabien LE LEZ
On Sun, 30 Jan 2005 01:35:52 +0100, "nico" :

Comment déclarer une classe indérivable en C++ ?


Je ne pense pas que ce soit possible.
Ne pas mettre de destructeur virtuel est un bon encouragement, mais
sinon, la meilleure solution reste de mettre un "Prière de ne pas
dériver" dans la documentation.

Pourquoi veux-tu empêcher la dérivation, au fait ?


--
;-)

Avatar
nico
Salut,

Pour le moment c'est de la simple curiosité (je n'en ai jamais eu besion)
j'ai juste vu que c'était possible en dotNet.

--
nico

Fabien LE LEZ wrote:
On Sun, 30 Jan 2005 01:35:52 +0100, "nico" :

Comment déclarer une classe indérivable en C++ ?


Je ne pense pas que ce soit possible.
Ne pas mettre de destructeur virtuel est un bon encouragement, mais
sinon, la meilleure solution reste de mettre un "Prière de ne pas
dériver" dans la documentation.

Pourquoi veux-tu empêcher la dérivation, au fait ?



Avatar
Olivier Azeau
Fabien LE LEZ wrote:
On Sun, 30 Jan 2005 01:35:52 +0100, "nico" :


Comment déclarer une classe indérivable en C++ ?



Je ne pense pas que ce soit possible.
Ne pas mettre de destructeur virtuel est un bon encouragement, mais
sinon, la meilleure solution reste de mettre un "Prière de ne pas
dériver" dans la documentation.

Pourquoi veux-tu empêcher la dérivation, au fait ?


Parce que la classe a un destructeur non virtuel ;-)


Avatar
Fabien LE LEZ
On Sun, 30 Jan 2005 12:01:04 +0100, Olivier Azeau
:

Pourquoi veux-tu empêcher la dérivation, au fait ?


Parce que la classe a un destructeur non virtuel ;-)


J'y avais sérieusement pensé (comme seule cause valable), mais je n'ai
pas osé l'écrire ;-P


--
;-)


Avatar
Alexandre
"nico" a écrit dans le message de news:
41fc2b97$0$14473$
Bonjour,

Comment déclarer une classe indérivable en C++ ?

Merci.

--
nico

Si tu n'as que des membres privés, et que tu déclares une 2e classe comme

amie (afin de pouvoir utiliser la 1ère classe), la 1ère n'est pas dérivable.
En fait, elle l'est mais on ne peut pas se servir des membres hérités. Ceci
dit, la 2e classe, elle, est dérivable, mais comme l'amitié ne s'hérite pas,
on ne peut toujours pas utiliser les membres privés de la 1ère... C'est un
peu lourd mais c'est une méthode possible pour empecher une dérivation
efficace.

Avatar
James Kanze
nico wrote:

Comment déclarer une classe indérivable en C++ ?


C'est un problème classique. (Je l'ai lu de Rob Murray il y a
environ dix ans.)

! class NonDerivable ;

! class BloqueLaDerivation
! {
! friend class NonDerivable ;
! BloqueLaDerivation() {}
! BloqueLaDerivation( BloqueLaDerivation const& ) ;
! } ;

! class NonDerivable : public virtual BloqueLaDerivation
! {
! // ...
! } ;

Depuis, j'en ai vu des solutions avec un BloqueLaDerivation
templatées.

--
James Kanze home: www.gabi-soft.fr
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 pl. Pierre Sémard, 78210 St.-Cyr-l'École, France +33 (0)1 30 23 00 34

Avatar
Michel Michaud
Dans le message ,
On Sun, 30 Jan 2005 12:01:04 +0100, Olivier Azeau
:

Pourquoi veux-tu empêcher la dérivation, au fait ?


Parce que la classe a un destructeur non virtuel ;-)


J'y avais sérieusement pensé (comme seule cause valable), mais je
n'ai pas osé l'écrire ;-P


Par souci de clarté, je précise ici (pour les lecteurs non avertis)
que même si la classe a un destructeur non virtuel, il n'y a aucune
raison a priori de vouloir empêcher la dérivation.

En fait, je vois mal pourquoi on ferait même une documentation disant
de ne pas dériver, plutôt que d'indiquer quels sont les problèmes
potentiels si on dérive... En un mot, je suis contre les « sealed »
et équivalents, qui existent pourtant en C# et Java (et j'imagine
ailleurs). J'aimerais bien que quelqu'un réussisse à me convaincre de
leur utilité (si c'est possible) autrement qu'en se servant de la
possibilité d'optimisation, qui me paraît bien faible dans des
langages qui offrent (ou devraient offrir) des possibilités
d'optimisation bien supérieures...

--
Michel Michaud
http://www.gdzid.com
FAQ de fr.comp.lang.c++ :
http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ/



Avatar
Fabien LE LEZ
On Sun, 30 Jan 2005 23:13:25 -0500, "Michel Michaud" :

En fait, je vois mal pourquoi on ferait même une documentation disant
de ne pas dériver, plutôt que d'indiquer quels sont les problèmes
potentiels si on dérive... En un mot, je suis contre les « sealed »
et équivalents, qui existent pourtant en C# et Java


J'ai l'impression que Java (et Microsoft Java, alias C#) veulent
enfermer le programmeur dans le mode de pensée prévu par l'auteur du
langage, et d'une manière générale cherchent à réduire les
possibilités.
La philosophie du C++ est opposée : "Fais ce que tu veux, mais prends
tes responsabilités et affronte les conséquences".


--
;-)

Avatar
Gabriel Dos Reis
Fabien LE LEZ writes:

| On Sun, 30 Jan 2005 23:13:25 -0500, "Michel Michaud" :
|
| >En fait, je vois mal pourquoi on ferait même une documentation disant
| >de ne pas dériver, plutôt que d'indiquer quels sont les problèmes
| >potentiels si on dérive... En un mot, je suis contre les « sealed »
| >et équivalents, qui existent pourtant en C# et Java
|
| J'ai l'impression que Java (et Microsoft Java, alias C#) veulent
| enfermer le programmeur dans le mode de pensée prévu par l'auteur du
| langage, et d'une manière générale cherchent à réduire les
| possibilités.
| La philosophie du C++ est opposée : "Fais ce que tu veux, mais prends
| tes responsabilités et affronte les conséquences".

Comme std::map<> ou std::set<> ?

Désolé, je n'ai pas pu résister.

-- Gaby
Avatar
Ludorg
"Michel Michaud" a écrit dans le message de
news:KfiLd.1880$
En un mot, je suis contre les « sealed »
et équivalents, qui existent pourtant en C# et Java (et j'imagine
ailleurs). J'aimerais bien que quelqu'un réussisse à me convaincre de
leur utilité (si c'est possible)


On peut développer une classe par exemple gérant la sécurité du système.
On a pas envie que l'utilisateur rédéfinisse par exemple la classe de
gestion du login...

Tschaw

1 2 3 4