j'espere que tu n'as pas l'intension d'utiliser un GC un jour ;-)
j'espere que tu n'as pas l'intension d'utiliser un GC un jour ;-)
j'espere que tu n'as pas l'intension d'utiliser un GC un jour ;-)
Laurent Deniau wrote in message
news:<co73ak$p5m$...j'espere que tu n'as pas l'intension d'utiliser un GC un jour ;-)
Quel rapport ? D'abord, le GC fait partie de l'implémentation -- c'est
Laurent Deniau <Laurent.Deniau@cern.ch> wrote in message
news:<co73ak$p5m$1@sunnews.cern.ch>...
j'espere que tu n'as pas l'intension d'utiliser un GC un jour ;-)
Quel rapport ? D'abord, le GC fait partie de l'implémentation -- c'est
Laurent Deniau wrote in message
news:<co73ak$p5m$...j'espere que tu n'as pas l'intension d'utiliser un GC un jour ;-)
Quel rapport ? D'abord, le GC fait partie de l'implémentation -- c'est
4.
struct D ;
struct B
{
B( D* p ) ;
D* p ;
} ;
struct D
{
D::D() : B( this ) {}
^^^^ ^^^
} ;
B::B( D* p ) : p( p ) {}
4.
struct D ;
struct B
{
B( D* p ) ;
D* p ;
} ;
struct D
{
D::D() : B( this ) {}
^^^^ ^^^
} ;
B::B( D* p ) : p( p ) {}
4.
struct D ;
struct B
{
B( D* p ) ;
D* p ;
} ;
struct D
{
D::D() : B( this ) {}
^^^^ ^^^
} ;
B::B( D* p ) : p( p ) {}
writes:
| Ce
| 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.
kanze@gabi-soft.fr writes:
| Ce
| 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.
writes:
| Ce
| 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.
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 (comme
James voudrait le faire croire).
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 (comme
James voudrait le faire croire).
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 (comme
James voudrait le faire croire).
- construction de l'objet D: dans D::D()
this est de type D* ET
this->__vtbl pointe sur la __vtbl de D ET
this->__vtbl_C pointe sur la __vtbl_C de D
__vtbl_C est une copie de la __vtbl de C dans la __vtbl de D
mais avec en plus les redefinitions des methodes virtuelles par D.
Meme si oopc ne fonctionne pas comme C++, tu peux regarder les schemas
du modele objet qui donne une idee des liens entre objet, sous-objet et
vtbl.
http://cern.ch/Laurent.Deniau/html/oopc/oopc.html
- construction de l'objet D: dans D::D()
this est de type D* ET
this->__vtbl pointe sur la __vtbl de D ET
this->__vtbl_C pointe sur la __vtbl_C de D
__vtbl_C est une copie de la __vtbl de C dans la __vtbl de D
mais avec en plus les redefinitions des methodes virtuelles par D.
Meme si oopc ne fonctionne pas comme C++, tu peux regarder les schemas
du modele objet qui donne une idee des liens entre objet, sous-objet et
vtbl.
http://cern.ch/Laurent.Deniau/html/oopc/oopc.html
- construction de l'objet D: dans D::D()
this est de type D* ET
this->__vtbl pointe sur la __vtbl de D ET
this->__vtbl_C pointe sur la __vtbl_C de D
__vtbl_C est une copie de la __vtbl de C dans la __vtbl de D
mais avec en plus les redefinitions des methodes virtuelles par D.
Meme si oopc ne fonctionne pas comme C++, tu peux regarder les schemas
du modele objet qui donne une idee des liens entre objet, sous-objet et
vtbl.
http://cern.ch/Laurent.Deniau/html/oopc/oopc.html
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 !
| une fois l'objet complet construit (et même déjà
| dans le constructeur 'D::D()'), puis il redevient
| 'B' dans le destructeur 'B::~B()'.
C'est que tu n'as pas bien compris les fonctions virtuelles et leur
mécanisme d'appel.
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 !
| une fois l'objet complet construit (et même déjà
| dans le constructeur 'D::D()'), puis il redevient
| 'B' dans le destructeur 'B::~B()'.
C'est que tu n'as pas bien compris les fonctions virtuelles et leur
mécanisme d'appel.
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 !
| une fois l'objet complet construit (et même déjà
| dans le constructeur 'D::D()'), puis il redevient
| 'B' dans le destructeur 'B::~B()'.
C'est que tu n'as pas bien compris les fonctions virtuelles et leur
mécanisme d'appel.