 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
Benoît Dejean Guest
|
Posted: Wed Jun 23, 2004 8:27 pm Post subject: static_cast et ~polymorphisme |
|
|
je ne m'explique pas pourquoi le code suivant compile ...
struct jobject { };
struct jclass : jobject { };
struct jother : jobject { };
jobject* factory(bool t)
{
if(t) return new jclass;
return new jother;
}
int main()
{
jobject *o = factory(false);
jclass *c = static_cast<jclass *>(o);
}
au début, je procédé sans class jother et sans factory, je me suis dit
que c'était mon compilateur qui me jouait des tour (genre il déduisait
un peu trop à mon gout)
il me semble pourtant qu'ici le static_cast est totalement incertain ...
et qu'après l'ajout d'une base virtuelle, il faudrait utiliser le
dynamic_cast ...
|
|
| Back to top |
|
 |
Nomak Guest
|
Posted: Wed Jun 23, 2004 9:24 pm Post subject: Re: static_cast et ~polymorphisme |
|
|
Le 23/06/2004 à 22:27:36, Benoît Dejean <bnet (AT) ifrance (DOT) com> a écrit:
| Quote: | je ne m'explique pas pourquoi le code suivant compile ...
struct jobject { };
struct jclass : jobject { };
struct jother : jobject { };
jobject* factory(bool t)
{
if(t) return new jclass;
return new jother;
}
int main()
{
jobject *o = factory(false);
jclass *c = static_cast<jclass *>(o);
}
au début, je procédé sans class jother et sans factory, je me suis dit
que c'était mon compilateur qui me jouait des tour (genre il déduisait
un peu trop à mon gout)
il me semble pourtant qu'ici le static_cast est totalement incertain ...
et qu'après l'ajout d'une base virtuelle, il faudrait utiliser le
dynamic_cast ...
|
Oui ton code est faux.
Avec un static_cast ou un reinterpret_cast, tu dis à ton compilo que
tu sais que ça va marcher, et qu'il n'a pas besoin de vérifier (en
gros).
Ici tu dois utiliser un dynamic_cast pour lui demander de vérifier le
cast (renvoie NULL si le cast échoue).
--
Nomak
|
|
| Back to top |
|
 |
Benoît Dejean Guest
|
Posted: Thu Jun 24, 2004 5:21 am Post subject: Re: static_cast et ~polymorphisme |
|
|
Le Wed, 23 Jun 2004 23:24:43 +0200, Nomak a écrit :
| Quote: | Le 23/06/2004 à 22:27:36, Benoît Dejean <bnet (AT) ifrance (DOT) com> a écrit:
je ne m'explique pas pourquoi le code suivant compile ...
Oui ton code est faux.
Avec un static_cast ou un reinterpret_cast, tu dis à ton compilo que
tu sais que ça va marcher, et qu'il n'a pas besoin de vérifier (en
gros).
|
la preuve
| Quote: | Ici tu dois utiliser un dynamic_cast pour lui demander de vérifier le
cast (renvoie NULL si le cast échoue).
|
ça je le sais et je le comprends bien, je me demande juste pourquoi mon
compilateur (gcc-3.[34]) accepte ça ... Comeau online n'y trouve rien à
redire.
|
|
| Back to top |
|
 |
Nomak Guest
|
Posted: Thu Jun 24, 2004 8:29 am Post subject: Re: static_cast et ~polymorphisme |
|
|
Le 24/06/2004 à 07:21:51, Benoît Dejean <bnet (AT) ifrance (DOT) com> a écrit:
| Quote: | Le Wed, 23 Jun 2004 23:24:43 +0200, Nomak a écrit :
Le 23/06/2004 à 22:27:36, Benoît Dejean <bnet (AT) ifrance (DOT) com> a écrit:
je ne m'explique pas pourquoi le code suivant compile ...
Oui ton code est faux.
Avec un static_cast ou un reinterpret_cast, tu dis à ton compilo que
tu sais que ça va marcher, et qu'il n'a pas besoin de vérifier (en
gros).
la preuve
Ici tu dois utiliser un dynamic_cast pour lui demander de vérifier le
cast (renvoie NULL si le cast échoue).
ça je le sais et je le comprends bien, je me demande juste pourquoi mon
compilateur (gcc-3.[34]) accepte ça ... Comeau online n'y trouve rien à
redire.
|
Parcequ'il respecte la norme et la norme dit un "static_cast sait ce
qu'il fait". Il ne _doit pas_ vérifier, c'est ce que tu demande en
utilisant ce type de cast.
--
Nomak
|
|
| Back to top |
|
 |
Horst Kraemer Guest
|
Posted: Thu Jun 24, 2004 1:01 pm Post subject: Re: static_cast et ~polymorphisme |
|
|
On Wed, 23 Jun 2004 22:27:36 +0200, Benoît Dejean <bnet (AT) ifrance (DOT) com>
wrote:
| Quote: | je ne m'explique pas pourquoi le code suivant compile ...
struct jobject { };
struct jclass : jobject { };
struct jother : jobject { };
jobject* factory(bool t)
{
if(t) return new jclass;
return new jother;
}
int main()
{
jobject *o = factory(false);
jclass *c = static_cast<jclass *>(o);
}
|
Il n'y aucune raison pour laquelle ce code ne devrait pas compiler.
Un static_cast d'un pointeur à jobject vers un pointeur à jclass est
légal selon la norme du langage C++ - mais le comportement du
programme est indéfini si l'objet auquel le pointeur pointe n'est pas
un objet du type jclass ou un objet d'une classe dérivée de jclass.
Donc l'usage "légal" de ce static_cast est limité à des cas ou le
programmeur sait que l'objet auquel le pointeur pointe à un "bon"
type.
Si tu veux vérifier si l'objet auquel le pointeur pointe a un "bon"
type il faut utiliser dynamic_cast (et il faut que la base ait une
fonction virtuelle).
C++ ne te fait pas payer ce que tu ne veux pas. Si tu dis static_cast
tu ne payes pas les couts de dynamic_cast - mais c'est à toi de
garantir que l'effet du cast a un sens.
--
Horst
|
|
| Back to top |
|
 |
Fabien LE LEZ Guest
|
Posted: Thu Jun 24, 2004 2:18 pm Post subject: Re: static_cast et ~polymorphisme |
|
|
On Thu, 24 Jun 2004 15:01:56 +0200, Horst Kraemer
<horst.kraemer (AT) epost (DOT) de>:
| Quote: | Donc l'usage "légal" de ce static_cast est limité à des cas ou le
programmeur sait que l'objet auquel le pointeur pointe à un "bon"
type.
|
D'où d'ailleurs le nom, "static" signifiant ici "connu à la
compilation".
--
schtroumpf schtroumpf
|
|
| Back to top |
|
 |
Benoît Dejean Guest
|
Posted: Thu Jun 24, 2004 5:43 pm Post subject: Re: static_cast et ~polymorphisme |
|
|
Le Thu, 24 Jun 2004 16:18:20 +0200, Fabien LE LEZ a écrit :
| Quote: | On Thu, 24 Jun 2004 15:01:56 +0200, Horst Kraemer
[email]horst.kraemer (AT) epost (DOT) de[/email]>:
Donc l'usage "légal" de ce static_cast est limité à des cas ou le
programmeur sait que l'objet auquel le pointeur pointe à un "bon"
type.
D'où d'ailleurs le nom, "static" signifiant ici "connu à la
compilation".
|
ok :D
il n'empêche, j'ai du mal à comprendre l'intérêt d'une telle chose si
ce n'est créer des problèmes
comme me l'a une fois du GdR, « si la norme le dit ... » ou je sais plus
d'ailleurs, bref qu'évidemment la norme est parole de
vérité/espérance/qu'importe
j'ai une autre question parente
que ce passe-t-il lors d'un *_cast<Base*>( p );
ou p est un un Derive* ne pointant pas vers un objet (0 ou n'importe quoi) ?
est-ce un UB, y a-t-il plusieurs cas à discerner ?
|
|
| Back to top |
|
 |
Fabien LE LEZ Guest
|
Posted: Thu Jun 24, 2004 7:04 pm Post subject: Re: static_cast et ~polymorphisme |
|
|
On Thu, 24 Jun 2004 19:43:38 +0200, Benoît Dejean <bnet (AT) ifrance (DOT) com>:
| Quote: | ou p est un un Derive* ne pointant pas vers un objet (0 ou n'importe quoi) ?
est-ce un UB, y a-t-il plusieurs cas à discerner ?
|
Si p est un pointeur non NULL, qui ne pointe pas vers un objet (ou
vers le successeur d'un objet, i.e. &objet + 1), il me semble qu'on a
un comportement indéfini de toutes façons...
--
schtroumpf schtroumpf
|
|
| Back to top |
|
 |
Benoît Dejean Guest
|
Posted: Thu Jun 24, 2004 10:28 pm Post subject: Re: static_cast et ~polymorphisme |
|
|
Le Thu, 24 Jun 2004 21:04:17 +0200, Fabien LE LEZ a écrit :
| Quote: | On Thu, 24 Jun 2004 19:43:38 +0200, Benoît Dejean <bnet (AT) ifrance (DOT) com>:
ou p est un un Derive* ne pointant pas vers un objet (0 ou n'importe quoi) ?
est-ce un UB, y a-t-il plusieurs cas à discerner ?
Si p est un pointeur non NULL, qui ne pointe pas vers un objet (ou
vers le successeur d'un objet, i.e. &objet + 1), il me semble qu'on a
un comportement indéfini de toutes façons...
|
mais si p est NULL / 0 que te semble-t-il ? que le cast renverra
invariablement 0 ?
|
|
| Back to top |
|
 |
Falk Tannhäuser Guest
|
Posted: Fri Jun 25, 2004 8:52 am Post subject: Re: static_cast et ~polymorphisme |
|
|
Benoît Dejean wrote:
| Quote: |
Le Thu, 24 Jun 2004 21:04:17 +0200, Fabien LE LEZ a écrit :
On Thu, 24 Jun 2004 19:43:38 +0200, Benoît Dejean <bnet (AT) ifrance (DOT) com>:
ou p est un un Derive* ne pointant pas vers un objet (0 ou n'importe quoi) ?
est-ce un UB, y a-t-il plusieurs cas à discerner ?
Si p est un pointeur non NULL, qui ne pointe pas vers un objet (ou
vers le successeur d'un objet, i.e. &objet + 1), il me semble qu'on a
un comportement indéfini de toutes façons...
mais si p est NULL / 0 que te semble-t-il ? que le cast renverra
invariablement 0 ?
|
Oui, c'est ce que dit la Norme (5.2.9/ .
Falk
|
|
| Back to top |
|
 |
kanze@gabi-soft.fr Guest
|
Posted: Fri Jun 25, 2004 12:16 pm Post subject: Re: static_cast et ~polymorphisme |
|
|
Benoît Dejean <bnet (AT) ifrance (DOT) com> wrote
| Quote: | Le Thu, 24 Jun 2004 16:18:20 +0200, Fabien LE LEZ a écrit :
On Thu, 24 Jun 2004 15:01:56 +0200, Horst Kraemer
[email]horst.kraemer (AT) epost (DOT) de[/email]>:
Donc l'usage "légal" de ce static_cast est limité à des cas ou le
programmeur sait que l'objet auquel le pointeur pointe à un "bon"
type.
D'où d'ailleurs le nom, "static" signifiant ici "connu à la
compilation".
ok :D
il n'empêche, j'ai du mal à comprendre l'intérêt d'une telle chose si
ce n'est créer des problèmes
|
I'intérêt d'un static_cast sur des pointeurs est assez limités, mais il
y a des cas quand même, ou tu sais bien quel est le type réel d'où est
provenu le void*, par exemple. (Avec void*, évidemment, tu ne peux pas
utiliser un dynamic_cast.)
| Quote: | comme me l'a une fois du GdR, « si la norme le dit ... » ou je sais
plus d'ailleurs, bref qu'évidemment la norme est parole de
vérité/espérance/qu'importe
|
C'est la bible d'une réligion:-). Le but, c'est qu'il fasse aussi partie
du contrat entre les fournisseurs des compilateurs et les utilisateurs.
Pour l'instant, malheureusement, on n'est pas encore là.
| Quote: | j'ai une autre question parente
que ce passe-t-il lors d'un *_cast<Base*>( p );
ou p est un un Derive* ne pointant pas vers un objet (0 ou n'importe
quoi) ?
|
Si p est un pointeur nul, le résultat est un pointeur nul du nouveau
type.
Si p designe l'élément un au delà de la fin d'un tableau, c'est une
bonne question. Je n'ai pas la moindre idée, et je ne trouve pas de
réponse rapide dans la norme.
Si p ne designe pas réelement un objet, n'est pas un pointeur nul, et ne
pointe pas à l'élément fictif un au delà de la fin d'un table, le fait
simplement de le lire est un comportement indéfini.
| Quote: | est-ce un UB, y a-t-il plusieurs cas à discerner ?
|
C'est du C++. Il y a toujours plusieurs cas à discerner. Il ne faut pas
faire simple quand on peut faire compliquer, non.
--
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
|
|
| Back to top |
|
 |
Benoît Dejean Guest
|
Posted: Fri Jun 25, 2004 6:30 pm Post subject: Re: static_cast et ~polymorphisme |
|
|
Le Fri, 25 Jun 2004 05:16:56 -0700, kanze a écrit :
merci à tous
|
|
| Back to top |
|
 |
Fabien LE LEZ Guest
|
Posted: Sun Jul 04, 2004 9:44 pm Post subject: Re: static_cast et ~polymorphisme |
|
|
On Sun, 04 Jul 2004 23:49:35 +0200, drkm <usenet.fclcxx (AT) fgeorges (DOT) org>:
| Quote: | Tiens. J'ai toujours entendu parler de la validité d'un pointeur
sur le successeur d'un objet dans le cadre des tableaux. Je ne
m'étais jamais posé la question en dehors de ce cadre.
|
Quelle est la différence entre un pointeur sur un objet et un pointeur
sur le premier objet d'un tableau de 1 élément ?
--
schtroumpf schtroumpf
Jean-Emile de France
|
|
| Back to top |
|
 |
drkm Guest
|
Posted: Sun Jul 04, 2004 9:49 pm Post subject: Re: static_cast et ~polymorphisme |
|
|
Fabien LE LEZ <gramster (AT) gramster (DOT) com> writes:
| Quote: | Si p est un pointeur non NULL, qui ne pointe pas vers un objet (ou
vers le successeur d'un objet, i.e. &objet + 1)
|
Tiens. J'ai toujours entendu parler de la validité d'un pointeur
sur le successeur d'un objet dans le cadre des tableaux. Je ne
m'étais jamais posé la question en dehors de ce cadre. Pointer vers
le « successeur » d'un objet est-il réellement permis pour tout
objet ?
--drkm
|
|
| Back to top |
|
 |
drkm Guest
|
Posted: Mon Jul 05, 2004 12:33 pm Post subject: Re: static_cast et ~polymorphisme |
|
|
Fabien LE LEZ wrote in message <7guge0p48o7t8mddmvud2rgnl44gg8ta7o (AT) 4ax (DOT) com>:
| Quote: | On Sun, 04 Jul 2004 23:49:35 +0200, drkm <usenet.fclcxx (AT) fgeorges (DOT) org>:
Tiens. J'ai toujours entendu parler de la validité d'un pointeur
sur le successeur d'un objet dans le cadre des tableaux. Je ne
m'étais jamais posé la question en dehors de ce cadre.
Quelle est la différence entre un pointeur sur un objet et un pointeur
sur le premier objet d'un tableau de 1 élément ?
|
Je ne sais pas. Je n'en vois pas. C'est pourquoi je posais la
question, car je en voyais rien s'y opposant, alors que je n'en vois
l'utilité que dans le cadre de tableau. Bien que je peux imaginer un
algorithme prenant une séquence en entrée (un itérateur de début et un
itérateur de fin, one past the end) que l'on veut utiliser sur un
objet unique :
MaClasse mon_objet ;
monAlgo( & mon_objet , & mon_objet + 1 ) ;
Ok. Je viens de trouver une utilisation. Donc ce code est légal ?
--drkm
|
|
| Back to top |
|
 |
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
|