Les classes derivees

Résolu
cs_Adeon Messages postés 293 Date d'inscription jeudi 21 août 2003 Statut Membre Dernière intervention 10 avril 2015 - 4 août 2007 à 19:18
cs_bissss Messages postés 1 Date d'inscription mardi 19 décembre 2000 Statut Membre Dernière intervention 20 août 2008 - 20 août 2008 à 23:03
Je pense avoir tout compris sur les classes sauf un petit point. le voici :

Considerons ces 3 classes :
class Vehicule
{
      float VitesseMoyenne;
      bool 1Avion0Voiture; //=true si c'est un avion, =false si c'est une voiture
      void SetInfo(Vehicule* VehiculeToSet);
};

class Avion : public Vehicule
{
      float altitude;
};

classe Voiture : public Vehicule
{
      int NbVitesse;
};

Bon c'est très shématique mais c'est plus facil a comprendre !
Tout le monde a une vitesseMoyenne.
l'information altitude est spécifique a l'avion.
l'information NbVitesse est spécifique a la voiture.

Maintenant imaginons la fonction SetInfo(Vehicule* VehiculeToSet) qui doit, pour une raison quelconque, quand elle est appelée, regler l'altitude a 10000 si son argument est un avion ou regler le nombre de vitesse a 5 si c'est une voiture.

Je la fabriquerai comme cela :
void Vehicule::SetInfo(Vehicule* VehiculeToSet)
{
      if ( VehiculeToSet->1Avion0Voiture ) { ((Avion*)VehiculeToSet)->altitude = 10000; }
      else { ((Voiture*)VehiculeToSet)->NbVitesse = 5;  }
}

Je me dit que l'argument est du type Vehicule et que par conséquant toucher a autre chose que les variables de vehicule est prohibé. Pourtant, pas d'erreur dans la compilation, a priori, ca marche Mais est-ce juste ? Si non comment corriger la fonction ?

Merci de votre aide
______________________
Adeon
http://warcrave.com/

8 réponses

vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 12
5 août 2007 à 18:52
Evidemment il ne faut pas faire de cast ici, mais définir la méthode SetInfo en virtuelle afin de la définir différemment dans chaque sous classe:

class Vehicule

{

  float VitesseMoyenne;
public:

  //bool 1Avion0Voiture;

  virtual void SetInfo() = 0;

};

class Avion : public Vehicule

{

  float altitude;
public:

  virtual void SetInfo();

};

class Voiture : public Vehicule

{

  int NbVitesse;
public:

  virtual void SetInfo();

};

void Avion::SetInfo()

{

  altitude = 10000;

}

void Voiture::SetInfo()

{

  NbVitesse = 5;

}

int main()

{

  Avion a;

  Voiture v;

  a.SetInfo();

  v.SetInfo();

}

_____________________________________
Un éditeur de ressources gratuit pour Windows
3
dletozeun Messages postés 546 Date d'inscription vendredi 13 février 2004 Statut Membre Dernière intervention 9 janvier 2008 1
4 août 2007 à 20:05
Salut,

Je connais pas parfaitement le c++, mais ce que tu as ecris ne me choque pas vu que dasn ta fonction SetInfo tu castes VehiculeToSet vers un type de classe dérivé de la classe Vehicule. Or Avion ou Voiture n'est q'une classe Vehicule avec des choses en plus....donc je vois pas de difficulté a convertir un objet de type Vehicule en un objet de type Avion ou Voiture, aucune donnée n'est perdue. Par contre il me semble que C++ interdit l'inverse.

Sinon ta fonction SetInfo sert à rien si tu la rend pas public.
0
caiman125 Messages postés 36 Date d'inscription mercredi 27 décembre 2006 Statut Membre Dernière intervention 25 novembre 2010
5 août 2007 à 02:35
SALUT  
tu peut declarer setinfo comme virtuel et puit tu la declare dans chaque classe fille sant acceder au variable de la classe pour savoire le type de vehicule
0
dletozeun Messages postés 546 Date d'inscription vendredi 13 février 2004 Statut Membre Dernière intervention 9 janvier 2008 1
5 août 2007 à 14:02
caiman125, oui ca semble etre la meilleure solution...
Adeon, ne prends pas en compte ce que je viens de dire plus haut, je crois que c'est faux, prends comme moi un bon cours de C++ pour comprendre ça ^^
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_juju12 Messages postés 966 Date d'inscription samedi 3 avril 2004 Statut Membre Dernière intervention 4 mars 2010 4
5 août 2007 à 18:17
Cast de mère vers fille à éviter comme la peste.
Au fait un truc : les variables pour identifier le type de classe, c'est un peu maladroit et contraire aux principes de la POO. Dans ton cas, c'est un exemple type de l'utilisation de l'héritage (virtuel).
0
cs_Adeon Messages postés 293 Date d'inscription jeudi 21 août 2003 Statut Membre Dernière intervention 10 avril 2015 2
6 août 2007 à 19:20
Merci a tous pour votre aide! je vais de ce pas corriger quelques petits bouts de mon code ^^.

______________________
Adeon
http://warcrave.com/
0
cs_Adeon Messages postés 293 Date d'inscription jeudi 21 août 2003 Statut Membre Dernière intervention 10 avril 2015 2
8 août 2007 à 19:48
Au cas ou, je rajoute ce lien qui me semble interressant :
http://c.developpez.com/faq/cpp/?page=conversions

______________________
Adeon, programmeur de jeux sur directX 9 (http://www.warcrave.com/2.html) a votre service !
0
cs_bissss Messages postés 1 Date d'inscription mardi 19 décembre 2000 Statut Membre Dernière intervention 20 août 2008
20 août 2008 à 23:03
location des voitures en UML
0