1

C'est une question de C++.
J'ai une classe A qui hérite des classes B et C.

Si j'ai:
C *c = new A();

Cela ne fonctionne pas:
B *b = (B *)c;
b->uneMethodeDeB();

Par contre, cela fonctionne:
A *a = (A *)c;
a->uneMethodeDeB();

sad

D'abord, est-ce que c'est normal?
J'ai cherché un peu sur internet, et j'ai l'impression qu'il faut utiliser les dynamic cast. Vous confirmez ? Est-ce qu'il y a moyen de faire sans (mon compilo ne supportant pas le RTTI) ?

2

Effectivement, tu ne peux pas faire de static_cast ou C-style cast entre 2 classes qui n'héritent pas l'une de l'autre, le seul moyen (sans RTTI) est de passer par la classe fille commune:
B *b = (B *)(A *)c;
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

3

Arf, OK ça ne m'arrange pas du tout ça!
Merci bien.

4

Attends, il y a quand-même une autre solution qui me vient à l'esprit: l'abus de virtual: dans la classe C, tu déclares virtual void B* cast_to_B() {return 0;} (pas besoin de la définition de B pour ça, un class B; suffit normalement), et dans A, tu le redéfinis en virtual void B* cast_to_B() {return (B*)this;}. Ensuite, tu peux utiliser B *b = c->cast_to_B();.

Ça peut aussi se varier, à la limite même avec une fonction cast universelle qui prend le type en tant que chaîne de caractères, à la QObject (mais QObject lui-même ne permet pas l'héritage multiple), ou en tant qu'ID numérique, et qui retourne un void * qu'il faut après recaster en le bon type.
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

5

MAGNIFIQUE, j'essaye de suite grin