Problème avec classes virtuelles
Bonjour à tous,
Je suis face à un problème dont je n'arrive pas à trouver la solution.
J'ai le code suivant:
Code:
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 :)