Bonjour à tous,

Je suis face à un problème dont je n'arrive pas à trouver la solution.
J'ai le code suivant:

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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
 
#include <iostream>
 
using namespace std;
 
 
////////////////////////////////////////////////////////
 
class A
{
 
public:
 
	A() { std::cout << "A BAD_0!" << std::endl; }
 
	A( unsigned int val )  { std::cout << "A BAD_1!" << std::endl; }
 
	A( float val_1, unsigned int val_2, unsigned int val_3 )  { std::cout << "A GOOD!" << std::endl; }
 
};
 
////////////////////////////////////////////////////////
 
class B : public A
{
public:
 
	B( unsigned int val = 0 ) : A( val ) 
	{ std::cout << "B BAD!" << std::endl; }
 
	B( float val_1, unsigned int val_2, unsigned int val_3 = 0) 
		: A( val_1, val_2, val_3 )
	{ std::cout << "B GOOD!" << std::endl; }
};
 
////////////////////////////////////////////////////////
 
//class C : public B // VERSION WITH NO PROBLEM
class C : public virtual B // VERSION WITH PROBLEM
{
public:
 
	C( unsigned int val = 0) : B( val ) 
	{ std::cout << "C BAD!" << std::endl; }
 
 
	C( float val_1,	unsigned int val_2, unsigned int val_3 = 0 ) 
		: B( val_1, val_2, val_3 )
	{ std::cout << "C GOOD!" << std::endl; }
 
};
 
////////////////////////////////////////////////////////
 
class D :  public virtual C
{
public:
 
 
	D( unsigned int val = 0) : C( val ) 
	{ std::cout << "D BAD!" << std::endl; }
 
	D( float val_1, unsigned int val_2, unsigned int val_3) 
		: C(val_1, val_2, val_3 )
	{ std::cout << "D GOOD!" << std::endl; }
};
 
////////////////////////////////////////////////////////
 
 
int main( int argc, char ** argv)
{
	D* d_instance = new D(1, 2, 3);
 
	std::cout << " ----" << std::endl;
 
	C* c_intance = new C(1, 2, 3 );
 
	getchar();
 
	return EXIT_SUCCESS;
}
Quand je l'exécute(sous linux avec g++ et sous windows avec visual C++) j'ai cette trace:

A BAD_1!
B BAD!
C GOOD!
D GOOD!
----
A GOOD!
B GOOD!
C GOOD!

Je ne comprends pas pourquoi pour D* d_instance = new D(1, 2, 3); il ne passe pas par les bons contructeurs.

Par contre si je remplace class C : public virtual B // VERSION WITH PROBLEM par class C : public B // VERSION WITH NO PROBLEM l'exécution est bonne. Il passe par les bons constructeurs.
voici la trace:
A GOOD!
B GOOD!
C GOOD!
D GOOD!
----
A GOOD!
B GOOD!
C GOOD!

Donc c'est le fait de déclarer la classe B comme virtuelle qui pose problème. Mais je ne vois pas en quoi !

J'ai bien trouvé cela http://www.greyc.ensicaen.fr/ensicaen/CPP/x2951.html Mais je ne me trouve pas dans ce cas de figure.

Si quelqu'un a une explication ! Merci