J'ai class B:A;
je d=E9clare un list<B> et un list<A> et je veux joyeusement les
parcourir de conserve en factorisant un list<A>::iterator pour les
deux... Et je me fais crier par g++ !
On a pas naturellement (naivement ?) que list<B> h=E9rite de list<A> ?
On a pas naturellement (naivement ?) que list<B> hérite de list<A> ?
Non. Un tableau de B ne dérive pas d'un tableau de A.
adebaene
meow wrote:
J'ai class B:A; class B : public A je suppose ....
je déclare un list<B> et un list<A> et je veux joyeusement les parcourir de conserve en factorisant un list<A>::iterator pour les deux... Et je me fais crier par g++ ! On a pas naturellement (naivement ?) que list<B> hérite de list<A> ?
Non, pour une raison très simple. Si c'était la cas, on pourrait écrire :
void insert_an_A (list<A>& liste) { A myA; liste.push_back(myA); }
int main() { list<B> maliste; B myB; maliste.push_back(myB);
//ok, ici maliste ne contient que des B
insert_an_A(maliste);
//oh oh, ici maliste contient des B et des A!!) }
Arnaud
meow wrote:
J'ai class B:A;
class B : public A je suppose ....
je déclare un list<B> et un list<A> et je veux joyeusement les
parcourir de conserve en factorisant un list<A>::iterator pour les
deux... Et je me fais crier par g++ !
On a pas naturellement (naivement ?) que list<B> hérite de list<A> ?
Non, pour une raison très simple. Si c'était la cas, on pourrait
écrire :
void insert_an_A (list<A>& liste)
{
A myA;
liste.push_back(myA);
}
int main()
{
list<B> maliste;
B myB;
maliste.push_back(myB);
J'ai class B:A; class B : public A je suppose ....
je déclare un list<B> et un list<A> et je veux joyeusement les parcourir de conserve en factorisant un list<A>::iterator pour les deux... Et je me fais crier par g++ ! On a pas naturellement (naivement ?) que list<B> hérite de list<A> ?
Non, pour une raison très simple. Si c'était la cas, on pourrait écrire :
void insert_an_A (list<A>& liste) { A myA; liste.push_back(myA); }
int main() { list<B> maliste; B myB; maliste.push_back(myB);
//ok, ici maliste ne contient que des B
insert_an_A(maliste);
//oh oh, ici maliste contient des B et des A!!) }
Arnaud
meow
class B : public A je suppose .... Euh... Je ne suis pas certain de mesurer toute l'importance de ce
'public'. Je veux dire : avec ton écriture, ce qui était public dans A le reste dans B. Avec la mienne, tout ce qui était dans A est toujours dans B mais maintenant en 'private'... Bon, OK, mais ça change quoi à mon problème ?
//oh oh, ici maliste contient des B et des A Je commence à voir où ça coince, merci.
Si je comprends bien, si List<B> hérite de list<A> on en vient à pouvoir insérer des A dans une list<B>, ce qu'on a le droit de faire uniquement si A: (public)B... Or on a l'inverse.
class B : public A je suppose ....
Euh... Je ne suis pas certain de mesurer toute l'importance de ce
'public'. Je veux dire : avec ton écriture, ce qui était public dans
A le reste dans B. Avec la mienne, tout ce qui était dans A est
toujours dans B mais maintenant en 'private'... Bon, OK, mais ça
change quoi à mon problème ?
//oh oh, ici maliste contient des B et des A
Je commence à voir où ça coince, merci.
Si je comprends bien, si List<B> hérite de list<A> on en vient à
pouvoir insérer des A dans une list<B>, ce qu'on a le droit de faire
uniquement si A: (public)B... Or on a l'inverse.
class B : public A je suppose .... Euh... Je ne suis pas certain de mesurer toute l'importance de ce
'public'. Je veux dire : avec ton écriture, ce qui était public dans A le reste dans B. Avec la mienne, tout ce qui était dans A est toujours dans B mais maintenant en 'private'... Bon, OK, mais ça change quoi à mon problème ?
//oh oh, ici maliste contient des B et des A Je commence à voir où ça coince, merci.
Si je comprends bien, si List<B> hérite de list<A> on en vient à pouvoir insérer des A dans une list<B>, ce qu'on a le droit de faire uniquement si A: (public)B... Or on a l'inverse.
Arnaud Debaene
meow wrote:
class B : public A je suppose .... Euh... Je ne suis pas certain de mesurer toute l'importance de ce
'public'. Je veux dire : avec ton écriture, ce qui était public dans A le reste dans B. Avec la mienne, tout ce qui était dans A est toujours dans B mais maintenant en 'private'... Bon, OK, mais ça change quoi à mon problème ?
class B : public A -> Un pointeur B* est convertible en A*
class B : A -> Un pointeur B* n'est pas convertible en A*
Arnaud
meow wrote:
class B : public A je suppose ....
Euh... Je ne suis pas certain de mesurer toute l'importance de ce
'public'. Je veux dire : avec ton écriture, ce qui était public dans
A le reste dans B. Avec la mienne, tout ce qui était dans A est
toujours dans B mais maintenant en 'private'... Bon, OK, mais ça
change quoi à mon problème ?
class B : public A
-> Un pointeur B* est convertible en A*
class B : A
-> Un pointeur B* n'est pas convertible en A*
class B : public A je suppose .... Euh... Je ne suis pas certain de mesurer toute l'importance de ce
'public'. Je veux dire : avec ton écriture, ce qui était public dans A le reste dans B. Avec la mienne, tout ce qui était dans A est toujours dans B mais maintenant en 'private'... Bon, OK, mais ça change quoi à mon problème ?
class B : public A -> Un pointeur B* est convertible en A*
class B : A -> Un pointeur B* n'est pas convertible en A*
Arnaud
Marc Boyer
Le 06-12-2005, meow a écrit :
ce qui était public dans A le reste dans B. Avec la mienne, tout ce qui était dans A est toujours dans B mais maintenant en 'private' class B : public A
-> Un pointeur B* est convertible en A*
Certes... Et pourtant, si on fait une conversion explicite ça semble se passer correctement : B *b = new B(); A *a = (A*)b;
Ca peut en effet bien se passer, parfois. Quand on sait comment un compilo implémente souvent l'héritage, en effet, on se dit que ça peut marcher. C'est le propre des UB que de parfois correspondre à ce que le programmeur voulait. Mais fait un peu d'héritage multiple pour voir.
Marc Boyer -- Entre le fort et le faible, c'est la liberte qui opprime et le droit qui libere. Henri Lacordaire, Dominicain
Le 06-12-2005, meow <ben@agat.net> a écrit :
ce qui était public dans A le reste dans B. Avec la mienne, tout ce qui était dans A est
toujours dans B mais maintenant en 'private'
class B : public A
-> Un pointeur B* est convertible en A*
Certes... Et pourtant, si on fait une conversion explicite ça semble
se passer correctement :
B *b = new B();
A *a = (A*)b;
Ca peut en effet bien se passer, parfois.
Quand on sait comment un compilo implémente souvent l'héritage,
en effet, on se dit que ça peut marcher.
C'est le propre des UB que de parfois correspondre à
ce que le programmeur voulait.
Mais fait un peu d'héritage multiple pour voir.
Marc Boyer
--
Entre le fort et le faible, c'est la liberte qui opprime et le droit
qui libere. Henri Lacordaire, Dominicain
ce qui était public dans A le reste dans B. Avec la mienne, tout ce qui était dans A est toujours dans B mais maintenant en 'private' class B : public A
-> Un pointeur B* est convertible en A*
Certes... Et pourtant, si on fait une conversion explicite ça semble se passer correctement : B *b = new B(); A *a = (A*)b;
Ca peut en effet bien se passer, parfois. Quand on sait comment un compilo implémente souvent l'héritage, en effet, on se dit que ça peut marcher. C'est le propre des UB que de parfois correspondre à ce que le programmeur voulait. Mais fait un peu d'héritage multiple pour voir.
Marc Boyer -- Entre le fort et le faible, c'est la liberte qui opprime et le droit qui libere. Henri Lacordaire, Dominicain
meow
ce qui était public dans A le reste dans B. Avec la mienne, tout ce qui était dans A est toujours dans B mais maintenant en 'private' class B : public A
-> Un pointeur B* est convertible en A*
Certes... Et pourtant, si on fait une conversion explicite ça semble se passer correctement : B *b = new B(); A *a = (A*)b;
ce qui était public dans A le reste dans B. Avec la mienne, tout ce qui était dans A est
toujours dans B mais maintenant en 'private'
class B : public A
-> Un pointeur B* est convertible en A*
Certes... Et pourtant, si on fait une conversion explicite ça semble
se passer correctement :
B *b = new B();
A *a = (A*)b;
ce qui était public dans A le reste dans B. Avec la mienne, tout ce qui était dans A est toujours dans B mais maintenant en 'private' class B : public A
-> Un pointeur B* est convertible en A*
Certes... Et pourtant, si on fait une conversion explicite ça semble se passer correctement : B *b = new B(); A *a = (A*)b;
Jean-Marc Bourguet
"meow" writes:
ce qui était public dans A le reste dans B. Avec la mienne, tout ce qui était dans A est toujours dans B mais maintenant en 'private' class B : public A
-> Un pointeur B* est convertible en A*
Certes... Et pourtant, si on fait une conversion explicite ça semble se passer correctement : B *b = new B(); A *a = (A*)b;
Ce cast a la C est en fait un reinterpret_cast. Ce n'est pas different de ce qui se passe si tu convertis ton B* en un pointeur vers une classe qui n'a aucun rapport avec B...
A+
-- Jean-Marc FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html Site de usenet-fr: http://www.usenet-fr.news.eu.org
"meow" <ben@agat.net> writes:
ce qui était public dans A le reste dans B. Avec la mienne, tout ce qui était dans A est
toujours dans B mais maintenant en 'private'
class B : public A
-> Un pointeur B* est convertible en A*
Certes... Et pourtant, si on fait une conversion explicite ça semble
se passer correctement :
B *b = new B();
A *a = (A*)b;
Ce cast a la C est en fait un reinterpret_cast. Ce n'est pas
different de ce qui se passe si tu convertis ton B* en un pointeur
vers une classe qui n'a aucun rapport avec B...
A+
--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html
Site de usenet-fr: http://www.usenet-fr.news.eu.org
ce qui était public dans A le reste dans B. Avec la mienne, tout ce qui était dans A est toujours dans B mais maintenant en 'private' class B : public A
-> Un pointeur B* est convertible en A*
Certes... Et pourtant, si on fait une conversion explicite ça semble se passer correctement : B *b = new B(); A *a = (A*)b;
Ce cast a la C est en fait un reinterpret_cast. Ce n'est pas different de ce qui se passe si tu convertis ton B* en un pointeur vers une classe qui n'a aucun rapport avec B...
A+
-- Jean-Marc FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html Site de usenet-fr: http://www.usenet-fr.news.eu.org
meow
Ce cast a la C est en fait un reinterpret_cast. Ce n'est pas different de ce qui se passe si tu convertis ton B* en un pointeur vers une classe qui n'a aucun rapport avec B...
Bon, je met l'étude des fonctions de cast sur la liste des trucs à faire rapidement...
Ce cast a la C est en fait un reinterpret_cast. Ce n'est pas
different de ce qui se passe si tu convertis ton B* en un pointeur
vers une classe qui n'a aucun rapport avec B...
Bon, je met l'étude des fonctions de cast sur la liste des trucs à
faire rapidement...
Ce cast a la C est en fait un reinterpret_cast. Ce n'est pas different de ce qui se passe si tu convertis ton B* en un pointeur vers une classe qui n'a aucun rapport avec B...
Bon, je met l'étude des fonctions de cast sur la liste des trucs à faire rapidement...
Fabien LE LEZ
On 6 Dec 2005 05:44:20 -0800, "meow" :
Bon, je met l'étude des fonctions de cast sur la liste des trucs à faire rapidement...
On peut faire un résumé rapide :
Un cast "à la C" : à éviter, car il faut une lecture très attentive pour savoir à quoi il correspond.
static_cast<> : cast au moment de la compilation. C'est le cast "normal".
dynamic_cast<> : cast pendant l'exécution. Généralement, c'est pour dire au programme (si B dérive de A) qu'un A* pointe en fait vers un B :
A* ptr= new B; B* ptr_B= dynamic_cast<B*>(ptr);
Les autres (reinterpret_cast<> et const_cast<>) : normalement, on ne les utilise pas. En fait, on les utilise quand il y a un problème dans le code, qu'on ne peut pas réparer. Le cas typique (pour const_cast<>) : une fonction (généralement écrite en C) prend un pointeur non-const comme paramètre, alors que d'après la documentation, la valeur pointée ne sera pas modifiée.
On 6 Dec 2005 05:44:20 -0800, "meow" <ben@agat.net>:
Bon, je met l'étude des fonctions de cast sur la liste des trucs à
faire rapidement...
On peut faire un résumé rapide :
Un cast "à la C" : à éviter, car il faut une lecture très attentive
pour savoir à quoi il correspond.
static_cast<> : cast au moment de la compilation. C'est le cast
"normal".
dynamic_cast<> : cast pendant l'exécution. Généralement, c'est pour
dire au programme (si B dérive de A) qu'un A* pointe en fait vers
un B :
A* ptr= new B;
B* ptr_B= dynamic_cast<B*>(ptr);
Les autres (reinterpret_cast<> et const_cast<>) : normalement, on ne
les utilise pas. En fait, on les utilise quand il y a un problème dans
le code, qu'on ne peut pas réparer.
Le cas typique (pour const_cast<>) : une fonction (généralement écrite
en C) prend un pointeur non-const comme paramètre, alors que d'après
la documentation, la valeur pointée ne sera pas modifiée.
Bon, je met l'étude des fonctions de cast sur la liste des trucs à faire rapidement...
On peut faire un résumé rapide :
Un cast "à la C" : à éviter, car il faut une lecture très attentive pour savoir à quoi il correspond.
static_cast<> : cast au moment de la compilation. C'est le cast "normal".
dynamic_cast<> : cast pendant l'exécution. Généralement, c'est pour dire au programme (si B dérive de A) qu'un A* pointe en fait vers un B :
A* ptr= new B; B* ptr_B= dynamic_cast<B*>(ptr);
Les autres (reinterpret_cast<> et const_cast<>) : normalement, on ne les utilise pas. En fait, on les utilise quand il y a un problème dans le code, qu'on ne peut pas réparer. Le cas typique (pour const_cast<>) : une fonction (généralement écrite en C) prend un pointeur non-const comme paramètre, alors que d'après la documentation, la valeur pointée ne sera pas modifiée.
meow
OK, merci, j'avais déjà commencé à regarder de la doc en ligne mais c'était tellement exhaustif que ça en devenait ésotérique. Ton résumé me permet de mieux comprendre tout ce que j'ai lu.
OK, merci, j'avais déjà commencé à regarder de la doc en ligne mais
c'était tellement exhaustif que ça en devenait ésotérique. Ton
résumé me permet de mieux comprendre tout ce que j'ai lu.
OK, merci, j'avais déjà commencé à regarder de la doc en ligne mais c'était tellement exhaustif que ça en devenait ésotérique. Ton résumé me permet de mieux comprendre tout ce que j'ai lu.