Les classes derivees

[Résolu]
Signaler
Messages postés
293
Date d'inscription
jeudi 21 août 2003
Statut
Membre
Dernière intervention
10 avril 2015
-
Messages postés
1
Date d'inscription
mardi 19 décembre 2000
Statut
Membre
Dernière intervention
20 août 2008
-
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

Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
8
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
Messages postés
546
Date d'inscription
vendredi 13 février 2004
Statut
Membre
Dernière intervention
9 janvier 2008
1
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.
Messages postés
36
Date d'inscription
mercredi 27 décembre 2006
Statut
Membre
Dernière intervention
25 novembre 2010

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
Messages postés
546
Date d'inscription
vendredi 13 février 2004
Statut
Membre
Dernière intervention
9 janvier 2008
1
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 ^^
Messages postés
966
Date d'inscription
samedi 3 avril 2004
Statut
Membre
Dernière intervention
4 mars 2010
4
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).
Messages postés
293
Date d'inscription
jeudi 21 août 2003
Statut
Membre
Dernière intervention
10 avril 2015
2
Merci a tous pour votre aide! je vais de ce pas corriger quelques petits bouts de mon code ^^.

______________________
Adeon
http://warcrave.com/
Messages postés
293
Date d'inscription
jeudi 21 août 2003
Statut
Membre
Dernière intervention
10 avril 2015
2
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 !
Messages postés
1
Date d'inscription
mardi 19 décembre 2000
Statut
Membre
Dernière intervention
20 août 2008

location des voitures en UML