Bonjour,

J'ai un petit problème de cross-casting

J'ai les classes de base suivantes :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
 
class A
{
public:
    A(void) : name("No name"){} 
    virtual ~A(void) {}
 
    virtual void setName(const QString& name) { this->name = name;}
    virtual QString getName() const                { return name;}
    [...]
private:
    QString name;
};

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
 
class B
{
public:
    B(void){} 
    virtual ~B(void) {}
 
    [...]
};

Et une classe C, D, E héritant à la fois de A et B
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
 
class C : public A, public B
{
public:
    C(void){} 
    virtual ~C(void) {}
 
    [...]
};
 
class D : public A, public B
{
public:
    D(void){} 
    virtual ~D(void) {}
 
    [...]
};
 
etc..

Dans une autre classe j'ai une QList de B*. J'y place uniquement des C*, D* et E*, par polymorphisme :

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
 
QList<B*> liste;
liste.append(new C);
liste.append(new D);
liste.append(new E);
[...]
 
// je récupère le premier élément :
QList<B*>::const_iterator i = itemsList.constBegin();
if( i != itemsList.constEnd() )
{
	// et je tente un cross-casting
        A* select = dynamic_cast<A* >(*i);
	//Prochaine ligne : BOOM !
        selected->getName();
}
Voilà bien-sur j'ai quelques hypothèses:
1) je fais n'importe quoi, je n'ai pas le droit de faire ça et il y a un problème de conception latent dans mon projet (pourtant ça ressemble sacrément à ça quand même).
2) name n'est jamais initialisé. Mais pourqui pourquoi je n'en est aucune idée
3) euh c'est tout en fait