Bonjour,
je me trouve face a un problême de compréhension je vous poste un petit code d'exemple pour vous l'exposer :
j'ai donc une classe virtuel "a" et une classe "b", la classe "c" dérive de "b" et "a" (dans cette ordre car dans le sens "a" et "b" le problême n'apparait plus).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33 class a { public : virtual void abc(void) = 0; }; class b { public : virtual int az(void) {return 4;} }; class c : public b, public a { public : void abc() {} }; class d { c* var1; public : d() {var1 = new c();qWarning() << var1;} a* rt() {return (a*)(var1);} }; int main(int argc, char *argv[]) { d* test = new d(); qWarning() << test->rt(); }
La classe "d" encapsule la classe "c" et possède une fonction qui renvoi un pointeur sur la classe a (virtuel) via un cast de la classe c qui est créer dans le constructeur de la classe d via la variable var1.
Le problème est le suivant quand j'affiche les adresses mémoires des pointeur de la classe "c" (var1) creer dans "d" et le pointeur de la classe "a" renvoyer via le cast de la classe c(var1) dans la fonction rt() ils sont différent !!!!
Comme je le dit plus haut si je declare la classe "C" de cette facon:
les adresses sont identiques.
Code : Sélectionner tout - Visualiser dans une fenêtre à part class c : public a, public b // j'inverse l'ordre des classe b et a
une autre constatation si au lieu de faire un cast (a*)var1 j'utilise un reinterpret_cast le probleme n'apparait pas non plus.
Quelqu'un pourrait t'il m'expliquer ce phénomène ?
ps : je compile avec gcc 4.2.3
Merci d'avance.
Partager