Terminologie: classe abstraite

Le
Luc Hermitte
Salut.

Je me posais une question au sujet de ce qu'était reconnu comme une
classe abstraite.

Jusqu'à présent, ma définition a toujours été : "une classe non
instanciable".

Dans la norme, la formulation ressemble à peu près à : "Une classe
abstraite est non instanciable (1). Une classe est abstraite si elle
dispose d'au moins une fonction membre qui soit virtuelle pure (fmqsvp)
(2)".

Là arrive le pinaillage. J'ai croisé des définitions qui disaient qu'une
"classe abstraite est une classe qui a au moins une fmqsvp" (3).
Si on s'en tient à la formulation officielle, la seconde partie est une
condition suffisante mais non nécessaire. Ce qui ne suffit pas à déduire
(3).

Si on définit une classe dont les constructeurs sont tous au moins
protégés (et dépourvue de créateurs amis ou assimilés, voir les fonctions
statiques des singletons), on arrive aussi à définir une classe qui ne
soit pas instanciable
à un détail près: elle peut quand même être instanciée dans les
fonctions membres des descendants de la classe.

struct Abs {
protected:
Abs() {}
};

struct fils : Abs {
void f() { Abs a; }
};


Est-ce ce détail qui nous donne la condition nécessaire (je ne vois pas
d'autres façon d'avoir des classes non instanciables et utilisables (tout
privé)) qui manquait pour justifier la formulation (3) ?

Personnellement, je n'aime pas cette formulation (3) car elle tient du
détail d'implémentation. C'est peut-être bien la seule façon de définir
des classes abstraites en C++, mais ce n'est pas ça qui est réellement
important AHMA.

Bref, j'aurais aimé avoir l'avis d'autres pinailleurs sur la question. Et
eventuellement savoir si j'avais manqué un point.


--
Luc Hermitte <hermitte at free.fr>
FAQ de <news:fr.comp.lang.c++> :
<http://www.cmla.ens-cachan.fr/Utilisateurs/dosreis/C++/FAQ/>
Dejanews : <http://groups.google.com/advanced_group_search>
Vos réponses Page 2 / 6
Trier par : date / pertinence
Luc Hermitte
Le #845541
"Michel Michaud" @news20.bellglobal.com:

Le texte est peut-être un peu tordu dans sa description, je comprends
ton point de vue. La deuxième phrase dit clairement qu'une classe est
abstraite si elle contient au moins un fonction virtuelle pure. Ce
n'est pas une condition suffisante, c'est une condition nécessaire.


euh ...
"Il suffit qu'il y ait une fonction virtuelle pure pour que la classe
soit dite abstraite". C'est bien une condition suffisante, mais non
nécessaire. Ce n'est pas "il est nécessaire qu'il y ait une fonction
virtuelle pure pour que la classe soit dite abstraite" (la formulation
(3))

Dans les faits ce (3) n'est pas faux (après réflexion), mais dans la
norme on n'a que (2) (et (1), mais il parle d'autre chose). Pourquoi il
n'est pas donné dans la norme, le (3) ?

(ce qui me genait au départ, c'est qu'à diverses reprises, j'ai trouvé
(3) sur des sites et non (2))

On ne peut pas sortir de là. Il faut donc prendre l'autre phrase comme
disant simplement ce qu'on peut faire d'une classe abstraite avant de
dire ce que c'est (comme le paragraphe qui précède d'ailleurs).
J'avoue que les mettre dans cet ordre ne semble pas idéal pour une
norme, mais c'est dans l'esprit C++ :-)


^^

--
Luc Hermitte FAQ de Dejanews :
Luc Hermitte
Le #845540
James Kanze 251-82-116.adsl.proxad.net:

Tu m'as un peu perdu, mais en ce qui concerne le C++, une classe est
abstraite si et seulement si elle a une ou plus de fonctions membre
virtuelles pures. C'est la définition.


Dans la formulation, ce n'est pas un "si et seulement si". Ou alors il
s'agit d'une subtilité de l'anglais que je connaissais pas. Et qui explique
un peu tout.


--
Luc Hermitte FAQ de Dejanews :
Michel Michaud
Le #845538
Dans le message ,
"Il suffit qu'il y ait une fonction virtuelle pure pour que la
classe soit dite abstraite". C'est bien une condition suffisante,
mais non nécessaire.


Mais ce n'est pas ce que la norme dit. Elle dit que la classe est
abstraite si elle contient une fonction virtuelle pure. Ce « si »
est descriptif : on pourrait le traduire par « quand »...

Ce n'est pas "il est nécessaire qu'il y ait
une fonction virtuelle pure pour que la classe soit dite abstraite"
(la formulation (3))


Je crois que tu as trop mis sur le « if »... C'est la définition
alors c'est un si et seulement si.

Encore une fois, la norme aurait pu faire mieux, mais avec tout ce
qu'il y a autour de cette phrase, le sens me paraît clair...

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

Gabriel Dos Reis
Le #899667
Luc Hermitte
| James Kanze | 251-82-116.adsl.proxad.net:
|
| > Tu m'as un peu perdu, mais en ce qui concerne le C++, une classe est
| > abstraite si et seulement si elle a une ou plus de fonctions membre
| > virtuelles pures. C'est la définition.
|
| Dans la formulation, ce n'est pas un "si et seulement si". Ou alors il
| s'agit d'une subtilité de l'anglais que je connaissais pas. Et qui explique
| un peu tout.

Je crois que la formulation de la norme est d'une clarté obscure.

-- Gaby
bruno_perso
Le #850048
Luc Hermitte wrote:

James Kanze 251-82-116.adsl.proxad.net:


Tu m'as un peu perdu, mais en ce qui concerne le C++, une classe est
abstraite si et seulement si elle a une ou plus de fonctions membre
virtuelles pures. C'est la définition.



Dans la formulation, ce n'est pas un "si et seulement si". Ou alors il
s'agit d'une subtilité de l'anglais que je connaissais pas. Et qui explique
un peu tout.




Je pense qu'il faut relire la norme en anglais:

10.4 Abstract classes [class.abstract]

1 The abstract class mechanism supports the notion of a general concept,
such as a shape, of which only more concrete variants, such as circle
and square, can actually be used. An abstract class can also be used
to define an interface for which derived classes provide a variety of
implementations.

2 An abstract class is a class that can be used only as a base class of
some other class; no objects of an abstract class can be created
except as sub-objects of a class derived from it. A class is abstract
if it has at least one pure virtual function. [Note: such a function
might be inherited: see below. ] A virtual function is specified pure
by using a pure-specifier (_class.mem_) in the function declaration in
the class declaration. A pure virtual function need be defined only
if explicitly called with the qualified-id syntax (_expr.prim_).

Dans ma compréhension de la norme et je partage l'appréciation de James
l'implication va dans ce sens :

classe abstraite => fonction membre virtuelle pure => classe non
instanciable.

A contrario:

pas de fonction membre virtuelle pure => n'est pas une classe abstraite


drkm
Le #850045
James Kanze
Dans les constructeurs et les destructeurs.


Évidemment. Merci.

--drkm

James Kanze
Le #849891
bruno_perso
|> Luc Hermitte wrote:

|> > James Kanze |> > news: 251-82-116.adsl.proxad.net:

|> >>Tu m'as un peu perdu, mais en ce qui concerne le C++, une classe
|> >>est abstraite si et seulement si elle a une ou plus de fonctions
|> >>membre virtuelles pures. C'est la définition. |> > Dans la
|> >>formulation, ce n'est pas un "si et seulement si". Ou alors |> >
|> >>il s'agit d'une subtilité de l'anglais que je connaissais pas. Et
|> >>|> > qui explique un peu tout.

|> Je pense qu'il faut relire la norme en anglais:

|> 10.4 Abstract classes [class.abstract]

|> 1 The abstract class mechanism supports the notion of a general concept,
|> such as a shape, of which only more concrete variants, such as circle
|> and square, can actually be used. An abstract class can also be used
|> to define an interface for which derived classes provide a variety of
|> implementations.

|> 2 An abstract class is a class that can be used only as a base class of
|> some other class; no objects of an abstract class can be created
|> except as sub-objects of a class derived from it. A class is abstract
|> if it has at least one pure virtual function. [Note: such a function
|> might be inherited: see below. ] A virtual function is specified pure
|> by using a pure-specifier (_class.mem_) in the function declaration in
|> the class declaration. A pure virtual function need be defined only
|> if explicitly called with the qualified-id syntax (_expr.prim_).

Avec une chose importante qui n'apparaît pas ici : le premier « abstract
class » dans la paragraphe 2 est en italique. Ce qui signifie que c'est
en fait la définition -- c'est donc une classe qui ne peut servir que
comme classe de base.

|> Dans ma compréhension de la norme et je partage l'appréciation de
|> James l'implication va dans ce sens :

|> classe abstraite => fonction membre virtuelle pure => classe non
|> instanciable.

|> A contrario:

|> pas de fonction membre virtuelle pure => n'est pas une classe abstraite

C'est ce que j'ai toujours cru, et c'était mon interprétation de
l'anglais dans la norme aussi avant de remarquer les italiques. Le fait
que les mots « abstract class » soit en italique dans la première phrase
du paragraphe 2 signifierait, en revanche, que la définition, c'est bien
la limitation qu'on a dans l'utilisation. (Mais je ne sais pas si c'est
exprès. Et peut-être la définition doit encompasser les deux premières
phrases du paragraphe, et non seulement la première.)

--
James Kanze
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
James Kanze
Le #849890
"Michel Michaud"
|> Dans le message ,
|> > "Il suffit qu'il y ait une fonction virtuelle pure pour que la
|> > classe soit dite abstraite". C'est bien une condition suffisante,
|> > mais non nécessaire.

|> Mais ce n'est pas ce que la norme dit. Elle dit que la classe est
|> abstraite si elle contient une fonction virtuelle pure. Ce « si »
|> est descriptif : on pourrait le traduire par « quand »...

Elle dit « si », et non « si et seulement si ». En plus, c'est dans la
phrase précédante où « abstract class » est écrit en italiques (ce qui
signifie dans la norme qu'il s'agit d'une définition).

Ça ne correspond pas à ce que j'ai toujours cru, ni ce qu'on m'a
toujours dit.

En revanche, dans la « définition », la norme n'en parle que des
restrictions d'utilisation. Ce qui n'est pas vraiment ce qu'on s'attend
d'une définition dans une norme. Il ne faut pas pousser trop pour croire
que la « définition » comprend en fait les deux phrases, et que le
« si » signifie en fait « si et seulement si ».

--
James Kanze
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
bruno_perso
Le #847083
James Kanze wrote:

bruno_perso
|> Luc Hermitte wrote:

|> > James Kanze |> > news: 251-82-116.adsl.proxad.net:

|> >>Tu m'as un peu perdu, mais en ce qui concerne le C++, une classe
|> >>est abstraite si et seulement si elle a une ou plus de fonctions
|> >>membre virtuelles pures. C'est la définition. |> > Dans la
|> >>formulation, ce n'est pas un "si et seulement si". Ou alors |> >
|> >>il s'agit d'une subtilité de l'anglais que je connaissais pas. Et
|> >>|> > qui explique un peu tout.

|> Je pense qu'il faut relire la norme en anglais:

|> 10.4 Abstract classes [class.abstract]

|> 1 The abstract class mechanism supports the notion of a general concept,
|> such as a shape, of which only more concrete variants, such as circle
|> and square, can actually be used. An abstract class can also be used
|> to define an interface for which derived classes provide a variety of
|> implementations.

|> 2 An abstract class is a class that can be used only as a base class of
|> some other class; no objects of an abstract class can be created
|> except as sub-objects of a class derived from it. A class is abstract
|> if it has at least one pure virtual function. [Note: such a function
|> might be inherited: see below. ] A virtual function is specified pure
|> by using a pure-specifier (_class.mem_) in the function declaration in
|> the class declaration. A pure virtual function need be defined only
|> if explicitly called with the qualified-id syntax (_expr.prim_).

Avec une chose importante qui n'apparaît pas ici : le premier « abstract
class » dans la paragraphe 2 est en italique. Ce qui signifie que c'est
en fait la définition -- c'est donc une classe qui ne peut servir que
comme classe de base.

|> Dans ma compréhension de la norme et je partage l'appréciation de
|> James l'implication va dans ce sens :

|> classe abstraite => fonction membre virtuelle pure => classe non
|> instanciable.

|> A contrario:

|> pas de fonction membre virtuelle pure => n'est pas une classe abstraite

C'est ce que j'ai toujours cru, et c'était mon interprétation de
l'anglais dans la norme aussi avant de remarquer les italiques. Le fait
que les mots « abstract class » soit en italique dans la première phrase
du paragraphe 2 signifierait, en revanche, que la définition, c'est bien
la limitation qu'on a dans l'utilisation. (Mais je ne sais pas si c'est
exprès. Et peut-être la définition doit encompasser les deux premières
phrases du paragraphe, et non seulement la première.)

Je ne l'avais pas compris l'italique comme cela. J'avais compris

l'italique comme étant la définition d'un élément notion.

La notion "classe abstraite" qui ne peut servir que comme classe de base
d'autres classes, ... Une classe est abstraite si elle possède au moins
une fonction membre purement virtuelle.

Je pense que pour le concepteur de compilateur la spécification a un
sens, il n'y a aucune raison qu'une classe abstraite ne puisse pas être
instancié par exemple ? Il suffirait seulement de s'assurer soit à la
compilation soit à l'exécution que les fonctions membres purement
virtuelles ne soient jamais appelées.
D'où l'intérêt de bien insister sur le fait qu'une classe abstraite ne
puisse pas être instanciée.

James Kanze
Le #847078
bruno_perso
|> James Kanze wrote:

[...]
|> > C'est ce que j'ai toujours cru, et c'était mon interprétation de
|> > l'anglais dans la norme aussi avant de remarquer les italiques. Le
|> > fait que les mots « abstract class » soit en italique dans la
|> > première phrase du paragraphe 2 signifierait, en revanche, que la
|> > définition, c'est bien la limitation qu'on a dans l'utilisation.
|> > (Mais je ne sais pas si c'est exprès. Et peut-être la définition
|> > doit encompasser les deux premières phrases du paragraphe, et non
|> > seulement la première.)

|> Je ne l'avais pas compris l'italique comme cela. J'avais compris
|> l'italique comme étant la définition d'un élément notion.

Je ne l'aurais pas compris comme ça normalement non plus. Mais ça fait
partie du méta-standard qui gouverne l'écriture des normes.

|> La notion "classe abstraite" qui ne peut servir que comme classe de
|> base d'autres classes, ... Une classe est abstraite si elle possède
|> au moins une fonction membre purement virtuelle.

La norme C++ définit le C++, non des notions.

|> Je pense que pour le concepteur de compilateur la spécification a un
|> sens, il n'y a aucune raison qu'une classe abstraite ne puisse pas
|> être instancié par exemple ? Il suffirait seulement de s'assurer
|> soit à la compilation soit à l'exécution que les fonctions membres
|> purement virtuelles ne soient jamais appelées. D'où l'intérêt de
|> bien insister sur le fait qu'une classe abstraite ne puisse pas être
|> instanciée.

Je ne dis pas que l'interdiction de les instantier ne soit pas
importante. Je ne la trouve pas bonne si elle est donnée en tant que
définition de « classe abstraite ». Selon les règles du jeu, néaumoins,
c'est le cas. (Mais je suis prèsque certain que ce n'était pas voulu.
Ces paragraphes sont pris directement de l'ARM. Or, il me semble
possible que quand il les a écrit, Stroustrup n'était pas encore au
courant de cette règle ISO, ou qu'il n'y pensait pas, et que quand on
les a répris, on n'y a pas pensé. Je crois en tout cas que l'intention
est assez claire -- c'est juste la présence des italiques, et
l'utilisation particulière des italiques dans la norme, qui me chagrine
un peu.)

--
James Kanze
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
Publicité
Poster une réponse
Anonyme