Les expressions « type statique » et « type dynamique » ne sont
formellement définies que pour les « object expressions », i.e. les
expressions qui désignent des objets.
Non, pA aura toujours comme type dynamique "A*", mais l'expression
"*pA" pourrait avoir un type différent -- je suppose que c'est ce qu
tu as voulu dire.
Les expressions « type statique » et « type dynamique » ne sont
formellement définies que pour les « object expressions », i.e. les
expressions qui désignent des objets.
Non, pA aura toujours comme type dynamique "A*", mais l'expression
"*pA" pourrait avoir un type différent -- je suppose que c'est ce qu
tu as voulu dire.
Les expressions « type statique » et « type dynamique » ne sont
formellement définies que pour les « object expressions », i.e. les
expressions qui désignent des objets.
Non, pA aura toujours comme type dynamique "A*", mais l'expression
"*pA" pourrait avoir un type différent -- je suppose que c'est ce qu
tu as voulu dire.
Gabriel Dos Reis wrote:Falk Tannhäuser writes:
| alors que pB1 pointe bien sur le sous-objet de classe
| 'B' dans l'objet 'd' de classe 'D' ; ledit sous-objet
| a été construit par le constructeur 'B::B()' ; ses
| types statique et dynamique ont été 'B' dans ledit
Et ils le restent. Tu confonds une chose ici : le type dynamique de
l'expression « *pB1 » (qui évolue avec la completion de la
constrution de l'objet "D" avec le type de l'objet "B")
| constructeur, mais son type dynamique devient 'D'
Non, pas du tout. Son type dynamique ne change pas. La différence
que tu vois est dûe au fait que l'objet complet ou l'objet le plus
dérivé qui contient ce sous-objet est construit quand tu invoques
foo() dans main() ; et donc la résolution de l'appel à la fonction
virtuelle va se faire selon cet objet complet. Mais le sous objet
"B" ne change pas de type dynamique. Heureusement, sinon
dynamic_cast<> n'a plus de sens !
Pour résumer :
On est tous les deux d'accord que :
- pB1 pointe sur le sous-objet "B" dans l'objet "D",
- le type dynamique de *pB1 est "D" pendant la durée de vie de l'objet
complet "D", ainsi que dans le constructeur et le destructeur de D
(et "B" dans le constructeur et le destructeur de "B").
Notre désaccord porte sur le type dynamique du sous-objet "B" pendant
la durée de vie de l'objet complet "D" (ainsi que dans le constructeur
/ destructeur de "D") :
Gabriel Dos Reis wrote:
Falk Tannhäuser <tannhauser86549spam@free.fr> writes:
| alors que pB1 pointe bien sur le sous-objet de classe
| 'B' dans l'objet 'd' de classe 'D' ; ledit sous-objet
| a été construit par le constructeur 'B::B()' ; ses
| types statique et dynamique ont été 'B' dans ledit
Et ils le restent. Tu confonds une chose ici : le type dynamique de
l'expression « *pB1 » (qui évolue avec la completion de la
constrution de l'objet "D" avec le type de l'objet "B")
| constructeur, mais son type dynamique devient 'D'
Non, pas du tout. Son type dynamique ne change pas. La différence
que tu vois est dûe au fait que l'objet complet ou l'objet le plus
dérivé qui contient ce sous-objet est construit quand tu invoques
foo() dans main() ; et donc la résolution de l'appel à la fonction
virtuelle va se faire selon cet objet complet. Mais le sous objet
"B" ne change pas de type dynamique. Heureusement, sinon
dynamic_cast<> n'a plus de sens !
Pour résumer :
On est tous les deux d'accord que :
- pB1 pointe sur le sous-objet "B" dans l'objet "D",
- le type dynamique de *pB1 est "D" pendant la durée de vie de l'objet
complet "D", ainsi que dans le constructeur et le destructeur de D
(et "B" dans le constructeur et le destructeur de "B").
Notre désaccord porte sur le type dynamique du sous-objet "B" pendant
la durée de vie de l'objet complet "D" (ainsi que dans le constructeur
/ destructeur de "D") :
Gabriel Dos Reis wrote:Falk Tannhäuser writes:
| alors que pB1 pointe bien sur le sous-objet de classe
| 'B' dans l'objet 'd' de classe 'D' ; ledit sous-objet
| a été construit par le constructeur 'B::B()' ; ses
| types statique et dynamique ont été 'B' dans ledit
Et ils le restent. Tu confonds une chose ici : le type dynamique de
l'expression « *pB1 » (qui évolue avec la completion de la
constrution de l'objet "D" avec le type de l'objet "B")
| constructeur, mais son type dynamique devient 'D'
Non, pas du tout. Son type dynamique ne change pas. La différence
que tu vois est dûe au fait que l'objet complet ou l'objet le plus
dérivé qui contient ce sous-objet est construit quand tu invoques
foo() dans main() ; et donc la résolution de l'appel à la fonction
virtuelle va se faire selon cet objet complet. Mais le sous objet
"B" ne change pas de type dynamique. Heureusement, sinon
dynamic_cast<> n'a plus de sens !
Pour résumer :
On est tous les deux d'accord que :
- pB1 pointe sur le sous-objet "B" dans l'objet "D",
- le type dynamique de *pB1 est "D" pendant la durée de vie de l'objet
complet "D", ainsi que dans le constructeur et le destructeur de D
(et "B" dans le constructeur et le destructeur de "B").
Notre désaccord porte sur le type dynamique du sous-objet "B" pendant
la durée de vie de l'objet complet "D" (ainsi que dans le constructeur
/ destructeur de "D") :
Gabriel Dos Reis wrote:Un constructeur d'une classe de base construit le sous-objet de la
classe de base, et non l'objet complet le plus dérivé. Et le type
dynamique de ce sous-objet reste, tout au long de sa vie, le type
statique vu par le constructeur. Il n'y a jamais de changement
Toute cette discussion me fait me poser une question.
Quel est le sens de "type statique" d'un objet ou de "type dynamique"
d'un objet ?
Un objet a toujours le même type.
En revanche, on peut parler du type statique d'une variable et du type
dynamique d'une variable.
Une variable pA définie par
A* pA;
a un type statique A*
et un type dynamique qui dépend de l'exécution, qui pourra être A* ou
un pointeur sur une sous-classe quelconque de A.
Mais parler de "type dynamique d'un objet" ne me semble pas avoir
grande signification.
Gabriel Dos Reis wrote:
Un constructeur d'une classe de base construit le sous-objet de la
classe de base, et non l'objet complet le plus dérivé. Et le type
dynamique de ce sous-objet reste, tout au long de sa vie, le type
statique vu par le constructeur. Il n'y a jamais de changement
Toute cette discussion me fait me poser une question.
Quel est le sens de "type statique" d'un objet ou de "type dynamique"
d'un objet ?
Un objet a toujours le même type.
En revanche, on peut parler du type statique d'une variable et du type
dynamique d'une variable.
Une variable pA définie par
A* pA;
a un type statique A*
et un type dynamique qui dépend de l'exécution, qui pourra être A* ou
un pointeur sur une sous-classe quelconque de A.
Mais parler de "type dynamique d'un objet" ne me semble pas avoir
grande signification.
Gabriel Dos Reis wrote:Un constructeur d'une classe de base construit le sous-objet de la
classe de base, et non l'objet complet le plus dérivé. Et le type
dynamique de ce sous-objet reste, tout au long de sa vie, le type
statique vu par le constructeur. Il n'y a jamais de changement
Toute cette discussion me fait me poser une question.
Quel est le sens de "type statique" d'un objet ou de "type dynamique"
d'un objet ?
Un objet a toujours le même type.
En revanche, on peut parler du type statique d'une variable et du type
dynamique d'une variable.
Une variable pA définie par
A* pA;
a un type statique A*
et un type dynamique qui dépend de l'exécution, qui pourra être A* ou
un pointeur sur une sous-classe quelconque de A.
Mais parler de "type dynamique d'un objet" ne me semble pas avoir
grande signification.
drkm writes:
| Arnaud Meurgues writes:
| > Gabriel Dos Reis wrote:
| >> Un constructeur d'une classe de base construit le sous-objet de
| >> la classe de base, et non l'objet complet le plus dérivé. Et le
| >> type dynamique de ce sous-objet reste, tout au long de sa vie, le
| >> type statique vu par le constructeur. Il n'y a jamais de
| >> changement
| > Toute cette discussion me fait me poser une question.
| > Quel est le sens de "type statique" d'un objet ou de "type
| > dynamique" d'un objet ?
| > Un objet a toujours le même type. En revanche, on peut parler du
| > type statique d'une variable et du type dynamique d'une variable.
| Si je me souviens bien, la définition de type dynamique (1.3.8, je
| pense) se réfère au type le plus dérivé d'une *expression* lvalue.
| Dans le cas d'une rvalue, elle définit le type dynamique comme égal
| au type statique. Remarque la différence entre « this » et « * this
| ».
Exact.
drkm <usenet.fclcxx@fgeorges.org> writes:
| Arnaud Meurgues <arnaud@meurgues.non.fr.invalid> writes:
| > Gabriel Dos Reis wrote:
| >> Un constructeur d'une classe de base construit le sous-objet de
| >> la classe de base, et non l'objet complet le plus dérivé. Et le
| >> type dynamique de ce sous-objet reste, tout au long de sa vie, le
| >> type statique vu par le constructeur. Il n'y a jamais de
| >> changement
| > Toute cette discussion me fait me poser une question.
| > Quel est le sens de "type statique" d'un objet ou de "type
| > dynamique" d'un objet ?
| > Un objet a toujours le même type. En revanche, on peut parler du
| > type statique d'une variable et du type dynamique d'une variable.
| Si je me souviens bien, la définition de type dynamique (1.3.8, je
| pense) se réfère au type le plus dérivé d'une *expression* lvalue.
| Dans le cas d'une rvalue, elle définit le type dynamique comme égal
| au type statique. Remarque la différence entre « this » et « * this
| ».
Exact.
drkm writes:
| Arnaud Meurgues writes:
| > Gabriel Dos Reis wrote:
| >> Un constructeur d'une classe de base construit le sous-objet de
| >> la classe de base, et non l'objet complet le plus dérivé. Et le
| >> type dynamique de ce sous-objet reste, tout au long de sa vie, le
| >> type statique vu par le constructeur. Il n'y a jamais de
| >> changement
| > Toute cette discussion me fait me poser une question.
| > Quel est le sens de "type statique" d'un objet ou de "type
| > dynamique" d'un objet ?
| > Un objet a toujours le même type. En revanche, on peut parler du
| > type statique d'une variable et du type dynamique d'une variable.
| Si je me souviens bien, la définition de type dynamique (1.3.8, je
| pense) se réfère au type le plus dérivé d'une *expression* lvalue.
| Dans le cas d'une rvalue, elle définit le type dynamique comme égal
| au type statique. Remarque la différence entre « this » et « * this
| ».
Exact.
drkm wrote:Gabriel Dos Reis writes:writes:
| qui importe ici, c'est que le type dynamique de l'objet change
| quand on entre dans le destructeur. Le type du pointeur n'a pas
| beaucoup d'importance.
Pour la n-ième fois, le type dynamique d el'objet ne change pas.
Si je comprend bien, tu dis que, que l'on soit dans le processus
de création d'un objet dérivé ou non, à partir du moment où l'on est
dans le destructeur, on sait que le type dynamique de l'objet est
égal au type statique. Car même si l'on est dans le processus de
destruction d'un objet dérivé, à ce moment là, les parties
spécifiques de l'objet dérivé ont été détruites, et l'on n'a plus
qu'on objet du type statique du destructeur dans lequel on se
trouve. Dans un destructeur, on connait exactement le type de
l'objet que l'on et en train de détruire.
Et vice-versa pour les constructeurs.
Ce qui est confus dans les propos de James, c'est qu'il utilise le
terme "type dynamique" pour parler du changement des pointeurs __vtbl
dans les sous-objets.
drkm wrote:
Gabriel Dos Reis <gdr@integrable-solutions.net> writes:
kanze@gabi-soft.fr writes:
| qui importe ici, c'est que le type dynamique de l'objet change
| quand on entre dans le destructeur. Le type du pointeur n'a pas
| beaucoup d'importance.
Pour la n-ième fois, le type dynamique d el'objet ne change pas.
Si je comprend bien, tu dis que, que l'on soit dans le processus
de création d'un objet dérivé ou non, à partir du moment où l'on est
dans le destructeur, on sait que le type dynamique de l'objet est
égal au type statique. Car même si l'on est dans le processus de
destruction d'un objet dérivé, à ce moment là, les parties
spécifiques de l'objet dérivé ont été détruites, et l'on n'a plus
qu'on objet du type statique du destructeur dans lequel on se
trouve. Dans un destructeur, on connait exactement le type de
l'objet que l'on et en train de détruire.
Et vice-versa pour les constructeurs.
Ce qui est confus dans les propos de James, c'est qu'il utilise le
terme "type dynamique" pour parler du changement des pointeurs __vtbl
dans les sous-objets.
drkm wrote:Gabriel Dos Reis writes:writes:
| qui importe ici, c'est que le type dynamique de l'objet change
| quand on entre dans le destructeur. Le type du pointeur n'a pas
| beaucoup d'importance.
Pour la n-ième fois, le type dynamique d el'objet ne change pas.
Si je comprend bien, tu dis que, que l'on soit dans le processus
de création d'un objet dérivé ou non, à partir du moment où l'on est
dans le destructeur, on sait que le type dynamique de l'objet est
égal au type statique. Car même si l'on est dans le processus de
destruction d'un objet dérivé, à ce moment là, les parties
spécifiques de l'objet dérivé ont été détruites, et l'on n'a plus
qu'on objet du type statique du destructeur dans lequel on se
trouve. Dans un destructeur, on connait exactement le type de
l'objet que l'on et en train de détruire.
Et vice-versa pour les constructeurs.
Ce qui est confus dans les propos de James, c'est qu'il utilise le
terme "type dynamique" pour parler du changement des pointeurs __vtbl
dans les sous-objets.