Bonjour,
Voici un morceau de code sur lequel j'ai un problème, en fait il se compile bien sous Visual Studio .NET 2003 ou sous Dev-cpp, mais il ne fait pas vraiment ce que je souhaiterai.
#include <iostream>
using namespace std;
class A {
public:
A(int a) :_a(a) {}
void write() {cout << " A : " << _a << endl; }
protected:
int _a;
};
class BInterface {
public:
void writeB() {cout << " B : " << _valeurB << endl; }
protected:
BInterface() : _valeurB(1){}
private :
int _valeurB;
};
class B : public A, public BInterface {
public:
B(int a): A(a), BInterface() {}
};
class CInterface {
public:
void writeC() {cout << " C : " << _valeurC << endl; }
protected:
CInterface() : _valeurC(2) {}
private :
int _valeurC;
};
class C : public A, public CInterface {
public:
C(int a) : A(a), CInterface() {}
};
class D : public A, public BInterface, public CInterface {
public:
D(int a) : A(a), BInterface(), CInterface() {}
};
int main(int argc, char* argv[])
{
A* ptr = new D(8);
ptr -> write();
((B*)ptr) -> writeB();
((C*)ptr) -> writeC();
cin.get();
}
>> SORTIE DU PROGRAMME :
A : 8
B : 1
C : 1 // ??? Tiens donc ???
Donc ce système marche (compile) mais n'est pas correct, j'ai l'impression (je me trompe peut-être) que les instructions
((B*)ptr) -> writeB();
((C*)ptr) -> writeC();
se font très mal, elles se baseraient sur l'organisation mémoire des classes B et C (normal vu le cast) et non sur celle de D.
J'aimerai obtenir le schéma d'héritage suivant :
A
/ \ En fait je sais qu'il faudrait déclarer class B : public virtual A mais dans ce cas,
/ \ je ne peux pas convertir directement un pointeur de A en un pointeur vers B
B C ou C sauf en utilisant un dynamic_cast. Or dans ma fonction, je connais le
\ / le type du pointeur sur A, je sais que c'est un pointeur sur B ou D. Ca me
\ / ça me semble donc contraignant d'utiliser un dynamic cast qui va faire le
D branchement sur la bonne fonction durant l'exécution...
En gros mon entête de fonction est le suivant :
void maFonction (A* ptr) {
// Ici je sais que lorsque j'ai appelé cette fonction A est un pointeur sur un B ou un D
((B*)ptr) -> writeB(); // Ligne qui ne marche pas si j'ai un héritage virtuel
}
Mon essai précédent était pour essayer de palier au problème de classes de bases virtuelles mais du coup je me retrouve coincé au niveau de ma fonction de traitement...
Est-ce que quelqu'un pourrait m'aider et me donner une piste pour que je puisse réorganiser l'ensemble de mes fonctions? Et au pire dois-je absoluement faire un dynamic_cast ?
_________
Aquarian