Problème d'héritage pour pas doué du C++ (qui a dit débutant?)

Bon alors voilà mon problème, j’ai des classes définies par héritage d’une classe commune et d’une autre classe variable.
J’ai besoin d’une structure qui contienne un pointeur vers une de ces classes et ensuite je veux pouvoir accéder aux membres héritées de la classe qui n’est pas commune sachant que je sais de quel type de classe il s’agit via GetItemType().
Question: Comment définir mon pointeur pour qu’il supporte les 3 types de classes et accéder aux membres hérités de la classe non commune ?
(Je peux modifier la structure, mais pas les classes)

/* Classe commune */
class ClassA{
 int Type;
 public:
int getItemType(){return Type;};
}

/* Classes varaibles */
class ClassB1{
 public:
void fooB1();
}
class ClassB2{
 public:
void fooB2();
}
class ClassB3{
 public:
void fooB3();
}

/* Classes qui héritent */
ClassC1:public ClassA, public ClassB1{
 public:
ClassC1(){Type = 1;}
}
ClassC2:public ClassA, public ClassB2{
 public:
ClassC2(){Type = 2;}
}
ClassC3:public ClassA, public ClassB3{
 public:
ClassC2(){Type = 3;}
}

/* Structure à définir correctement ! */
typedef struct structureClass{
 pointer to ClassC1 ou C2 ou C3 ???;
} t_structureClass;

C’est assez simple et l’exercice est plutôt formateur. Il faut utiliser la notion de méthode virtuelle.

Avant propos : le code que je lis est vraiment… caca

 pOri = &oC2 ;  pOri->Get() ;
 pOri = &oC3 ;  pOri->Get() ;
 return( 0 ) ; } [/quote][i]Ce message a été édité par Moktar le 06/08/2003[/i]

En fait, je ne pense pas que ça puisse marcher car dans ce cas là, ça suppose que Get est commune aux 3 classes C1, C2 et C3 (mais que le code n’est pas le même pour ces 3 classes) alors que moi je veux accéder aux éléments hérités de B1, B2 et B3 qui n’ont pas forcément qq chose en commun! (et en plus je peux pas toucher aux classes)
En fait, je viens de penser à une solution (probablement pas très propre!) mais qui devrait avoir le mérite de marcher.

typedef struct structureClass{   ClassA *pA;   ClassC1 *pC1;   ClassC2 *pC2;   ClassC3 *pC3; } t_structureClass;

switch( pA->GetType() ){
  case 1:
  pC1->fooB1();
  break;
  case 1:
  pC2->fooB2();
  break;
  case 1:
  pC3->fooB3();
  break;
  default:
  break;
}[/quote]Par contre j’augmente la taille de ma structure d’un nombre de pointeurs égale au nombre de classes héritées.
(Il est totalement permis de me proposer une meilleure solution)
(Il est tout autant permis de critiquer le code “caca”(©Moktar))

Ce message a été édité par qvb le 06/08/2003
Ce message a été édité par qvb le 06/08/2003

Ouarf, tu ne sais pas à quoi tu t’exposes en demandant des avis critique

int main(void)

{
void * pUniversal ;

    pUniversal = &oC1 ;
    ((ClassC1 *)pUniversal)->ClassB1::fooB1() ;

    pUniversal = &oC2 ;
    ((ClassC2 *)pUniversal)->ClassB2::fooB2() ;

    pUniversal = &oC3 ;
    ((ClassC3 *)pUniversal)->ClassB3::fooB3() ;

    return( 0 ) ;

}[/quote]

Moktar, c’est ça que tu cherches ? …
Ce message a été édité par xentyr le 06/08/2003

Nickel, merci Xentyr

Bon bah merci à vous (enfin surtout à Moktar, quoique Xentyr )
Pis dès ce soir je vais pouvoir aller faire plein de caca (

héhé no pb, you’re welcome. C’est dommage, tu aurais pu faire vraiment du C++ avec cette notion de méthode virtuelle, tant pis. J’espère au moins avoir exprimé suffisamment clairement cette notion… (je n’en suis pas sûr).

Ca m’a donné l’occasion de jeter un coup d’oeil à un tutorial sur le sujet. Et donc si j’ai tout compris (???) la classe intermédiaire qui contient Get(), comme elle ne sert pas directement, tu aurais aussi pu en faire une classe abstraite en remplaçant le:

virtual Get(){ ... };
par
virtual Get() =0;[/quote]Voilà, mais un jour je me plongerai vraiment là dedans. Mais malheureusement, j'ai pas vraiment le temps pour l'instant

Mmmm pas vraiment.

En fait, lorsqu’une méthode VIRTUELLE d’un objet est appelée, c’est la méthode de la classe la plus haute dans la hiérarchie qui sera sollicité

class A { public :   virtual void run(void) { cout << "je suis dans class A" << endl ; } } ;

class B : public A
{
public :
  virtual void run(void) { cout << “je suis dans class B” << endl ; }
} ;

void main(void)
{
  B   oB ;  // instanciation d’un objet de type B
  A *  pA ; // pointeur sur un objet de type A

  pA = &oB  // je fais pointer pA sur l’objet oB
  // c’est correct car l’objet B est aussi de type A
  // cf. héritage

  pA->run() ; // affiche : je suis dans class B
  // pourtant pA est de type pointeur sur un objet de
// classe A… c’est ça la virtualité.

  pA->A::run() ; // affiche : je suis dans class A
// dans ce cas, on “force” (via l’opérateur de
// portée) l’appel à la méthode de la class A
}

La déclaration :

class C { public :   virtual void run(void) = 0 ; } ;[/quote]N'indique pas la présence d'un classe abstraite mais d'une méthode virtuelle pure. C'est le même principe que la méthode virtuelle sauf que cette fois-ci, il est OBLIGATOIRE de surcharger la méthode run. Le compilo va te le dire .

EDIT : désolé pour les alignements mais en composition c’était nickel
Ce message a été édité par Moktar le 06/08/2003

C’est un problème d’héritage ? Parles-en à ton notaire  !

Lachlan -> Je pense que tu as pas mal résumé TA situation avec ton smiley
Moktar -> Merci beaucoup pour toutes ses explication

[quote] Ce message a été édité par Raistlin le 06/08/2003

******* GROSSE DÉRIVE *******

Ils sont tous simplement glânés çà et là, au gré de nos pérégrinations sur la Toile… 

******* GROSSE DÉRIVE *******[/quote]

Re-GROSSE DERIVE :

Mais y a pas un moyen pour les mettre autre que le c/c ?

FIN de re-GROSSE DERIVE :

Ben c’est simple, tu les uploades sur ton site. Mon ami le :vomi: pointe vers MON site Free, pas vers le site d’où j’ai pris ce smiley (d’ailleurs, j’en avais trouvé plein sur ce site, mais je ne me rappelle plus l’URL )…
Ce message a été édité par xentyr le 06/08/2003

Euh ok merci  

Ce message a été édité par Raistlin le 06/08/2003

Tiens en voilà :
http://community.the-underdogs.org/smiley/gallery.htm
http://www.inforum-city.com/
http://hugejul.free.fr/gif/
http://forum.hardware.fr/smilieperso.php3
http://perso.wanadoo.fr/thenetweb/Smilies/smilies.htm

Merci bien héhé

Yep thanks too Moktar