Bonjour,

je me trouve face a un problême de compréhension je vous poste un petit code d'exemple pour vous l'exposer :
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();
}
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).
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:
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
les adresses sont identiques.

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.