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>
"Michel Michaud" wrote in news:fmVbd.54929$3C6.2103230 @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 <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>
"Michel Michaud" <mm@gdzid.com> wrote in news:fmVbd.54929$3C6.2103230
@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 <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>
"Michel Michaud" wrote in news:fmVbd.54929$3C6.2103230 @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 <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>
Luc Hermitte
James Kanze wrote in 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.
-- 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>
James Kanze <kanze@gabi-soft.fr> wrote in news:m21xfzizsu.fsf@lns-p19-1-82-
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 <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>
James Kanze wrote in 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.
-- 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>
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 »...
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/
Dans le message Xns958497D8DDFE0isyfur@127.0.0.1,
"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 mm@gdzid.com
http://www.gdzid.com
FAQ de fr.comp.lang.c++ :
http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ/
"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
Luc Hermitte writes:
| James Kanze wrote in 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 crois que la formulation de la norme est d'une clarté obscure.
-- Gaby
Luc Hermitte <hermitte@free.fr.invalid> writes:
| James Kanze <kanze@gabi-soft.fr> wrote in news:m21xfzizsu.fsf@lns-p19-1-82-
| 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.
| James Kanze wrote in 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 crois que la formulation de la norme est d'une clarté obscure.
-- Gaby
bruno_perso
Luc Hermitte wrote:
James Kanze wrote in 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_).
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
Luc Hermitte wrote:
James Kanze <kanze@gabi-soft.fr> wrote in news:m21xfzizsu.fsf@lns-p19-1-82-
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
James Kanze wrote in 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_).
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
|> > James Kanze wrote in |> > 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
bruno_perso <nospam@nospam.com> writes:
|> Luc Hermitte wrote:
|> > James Kanze <kanze@gabi-soft.fr> wrote in
|> > news:m21xfzizsu.fsf@lns-p19-1-82- 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 wrote in |> > 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
"Michel Michaud" writes:
|> 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
"Michel Michaud" <mm@gdzid.com> writes:
|> Dans le message Xns958497D8DDFE0isyfur@127.0.0.1,
|> > "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
|> 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
James Kanze wrote:
bruno_perso writes:
|> Luc Hermitte wrote:
|> > James Kanze wrote in |> > 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 wrote:
bruno_perso <nospam@nospam.com> writes:
|> Luc Hermitte wrote:
|> > James Kanze <kanze@gabi-soft.fr> wrote in
|> > news:m21xfzizsu.fsf@lns-p19-1-82- 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 wrote in |> > 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
bruno_perso writes:
|> 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
bruno_perso <nospam@nospam.com> writes:
|> 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
[...] |> > 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