Ok, c'est bien ce que je pensais, ce code ne peut pas fonctionner. EN fait il ne doit meme pas compiler.
D'abors la fonction afficher n'est pas une fonction de classe. Et donc elle ne peut pas avoir de qualifier const. si tu vire le const de sa specification ca ne peut toujours pas fonctionner, mais tu as retirer une erreur:
void afficher(Vehicule v)
{
v.affiche();
}
Ensuite cette ligne dans le main n'est pas valide non plus. Probablement tu voulais definir un objet BMW de type Voiture. Et appeller la fonction afficher.
int main()
{
Voiture BMW;
afficher(BMW); //Voiture est une sous classe de Vehicule
}
Mais ca, ca ne fait pas ce que tu penses que ca devrai faire. Ce qui se passe ici est que tu passe une objet de type Voiture a une fonction qui prends un Objet de type Vehicule en parametre. Donc C++ initialize un objet DIFFERENT de type Vehicule qu'il initialise par copie de l'objet BMW upcaster vers le type vehicule. (Le constructeur par copie implicte de Vehicule etant de signature Vehicule::Vehicule (const Vehicule&), le compilateur commence par extraire une reference de BMW de type Voiture, puis l'upcaste vers une reference de type Vehicule et la passe en parametre au constructeur par copie de Vehicule.)
Je pense que ce n'est pas ce que tu voulais, tu voulais certainement passer une reference a l'objet BMW. Il faut donc definir la fonction afficher pour prendre une reference:
void afficher(Vehicule& v)
{
v.affiche();
}
Mais Ca ne regle toujours pas ton probleme. Qui est que tu obtiens le message sur la sortie standard: "Ceci est un Vehicule". En effet c'est logique, tu appelles la fonction affiche sur une reference de type Vehicule, donc le compilateur regarde dans la liste des fonctions de Vehicule et trouve une fonction non-virtuelle a appelle. Et donc il l'appelle.
Ce que tu voulais certainement faire, est declarer la fonction affiche() comme une fonction virtuelle. Une fois que tu ajoutes les deux virtual qui vont bien, la fonction afficher cherche la fonction affiche de Vehicule, trouve une fonction virtual. Elle regarde dans la v-table de l'objet et y trouve l'addresse de la fonction Voiture::affiche. C'est cette fonction qu'elle appelle alors.
Le code final est:
- include <iostream>
- include <string>
using namespace std;
class Vehicule
{
public:
virtual void affiche() const; //Affiche une description du Vehicule
static void toast();
protected:
int m_prix; //Chaque véhicule a un prix
};
class Voiture : public Vehicule //Une Voiture EST UN Vehicule
{
public:
virtual void affiche() const;
private:
int m_portes; //Le nombre de portes de la voiture
};
void Vehicule::affiche() const
{
cout << "Ceci est un vehicule." << endl;
}
void Voiture::affiche() const
{
cout << "Ceci est une voiture." << endl;
}
void Vehicule::toast()
{
cout << "Ceci est une fonction statique" << endl;
}
void afficher(Vehicule& v)
{
v.affiche();
}
int main()
{
Voiture BMW;
afficher(BMW); //Voiture est une sous classe de Vehicule
}
Comme tu as pu le voir, tous ces problemes la sont des histoires de type et de conversion implicite.