OVH Cloud OVH Cloud

Héritage de conteneurs A list

11 réponses
Avatar
meow
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> ?

10 réponses

1 2
Avatar
Fabien LE LEZ
On 2 Dec 2005 07:37:20 -0800, "meow" :

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.

Avatar
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

Avatar
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.

Avatar
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


Avatar
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



Avatar
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;


Avatar
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



Avatar
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...

Avatar
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.

Avatar
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.
1 2