Hoï ! En ce moment j'étudie l'héritage, et donc avec ça, le polymorphisme.
Seulement voilà, je n'arrive pas à faire de résolution de lien, à chaque fois c'est la méthode de la classe mère qui est appelée. Pourtant cette fonction est bien virtuelle et j'utilise un pointeur.
Voici le code :
test.h :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#ifndef TEST_H_INCLUDED
#define TEST_H_INCLUDED
 
#include <iostream>
 
 
class Vehicule
{
public:
    int getAnneeConstr() const;
    virtual void afficher() const;
    int getRoues() const;
    Vehicule();
    Vehicule(int a);
    Vehicule(int a,int b);
    virtual ~Vehicule();
protected:
    int m_prix;
    int m_anneeDeConstruction;
};
class Voiture:public Vehicule
{
public:
    void afficher() const;
    int roues() const;
    Voiture();
    Voiture(int a,int b,int c);
private:
    int m_portes;
};
class Moto:public Vehicule
{
public:
    void afficher() const;
    int roues() const;
    Moto();
    Moto(double a,int b,int c);
private:
    double m_vitesseMax;
};
class Camion:public Vehicule
{
public:
    void afficher() const;
    int roues() const;
    Camion();
    Camion(double a,int b,int c);
private :
    double m_poidsMax;
};
 
 
void afficheVehicule(Vehicule const& a);
 
 
#endif // TEST_H_INCLUDED
test.cpp :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#include <iostream>
#include "test.h"
 
using namespace std;
 
void afficheVehicule(Vehicule const& a)
{
    a.afficher();
}
 
Vehicule::Vehicule():m_prix(5000),m_anneeDeConstruction(2000){}
Vehicule::Vehicule(int a,int b):m_prix(a),m_anneeDeConstruction(b){}
Vehicule::~Vehicule(){};
void Vehicule::afficher() const
{
    cout<<"Ceci est un vehicule coutant "<<m_prix<<" euros."<<endl;
}
int Vehicule::getAnneeConstr() const
{
    return m_anneeDeConstruction;
}
 
Voiture::Voiture():m_portes(2){}
Voiture::Voiture(int a,int b,int c):Vehicule(b,c),m_portes(a){}
void Voiture::afficher() const
{
    cout<<"Ceci est une voiture coutant "<<m_prix<<" euros et ayant "<<m_portes<<" portes."<<endl;
}
int Voiture::roues() const
{
    return 4;
}
 
Moto::Moto():m_vitesseMax(100){}
Moto::Moto(double a,int b,int c):Vehicule(b,c),m_vitesseMax(a){}
void Moto::afficher() const
{
    cout<<"Ceci est une moto coutant "<<m_prix<<" euros et montant jusqu'a "<<m_vitesseMax<<" km/h."<<endl;
}
int Moto::roues() const
{
    return 2;
}
 
Camion::Camion():m_poidsMax(38){}
Camion::Camion(double a,int b,int c):Vehicule(b,c),m_poidsMax(a){}
void Camion::afficher() const
{
    cout<<"Ceci est un camion coutant "<<m_prix<<" euros et pouvant porter jusqu'a "<<m_poidsMax<<" tonnes."<<endl;
}
int Camion::roues() const
{
    return 10;
}
main.cpp :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
#include <iostream>
#include <vector>
#include "test.h"
 
using namespace std;
 
 
int main()
{
    string reponse;
    double b;
    int c,d,answer;
    Vehicule* ptr(NULL);
    vector<Vehicule>garage(0);
    cout<<"Ajouter un vehicule ?"<<endl;
    cin>>reponse;
    while(reponse=="oui" || reponse=="OUI" || reponse=="Oui")
    {
        cout<<"1:Voiture ; 2:Moto ; 3:Camion"<<endl;
        cin>>answer;
        switch(answer)
        {
        case 1:
            cout<<"nbrPortes prix anneeDeConstruction"<<endl;
            cin>>b>>c>>d;
            garage.push_back(Voiture(b,c,d));
            break;
        case 2:
            cout<<"vitesseMax prix anneeDeConstruction"<<endl;
            cin>>b>>c>>d;
            garage.push_back(Moto(b,c,d));
            break;
        case 3:
            cout<<"poidsMax prix anneeDeConstruction"<<endl;
            cin>>b>>c>>d;
            garage.push_back(Camion(b,c,d));
            break;
        default:
            cout<<"prix anneeDeConstruction"<<endl;
            cin>>c>>d;
            garage.push_back(Vehicule(c,d));
            break;
        }
        for(int i(0);i<(int)garage.size();i++)
        {
            ptr=&garage[i];
            ptr->afficher();
        }
        cout<<"Ajouter un vehicule ?"<<endl;
        cin>>reponse;
    }
    return 0;
}
Est-ce que c'est le fait d'avoir utilisé un tableau qui pose problème ? Ou alors j'utilise mal le pointeur ?
À noter que j'ai aussi essayé en utilisant une référence avec cette fonction :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
void afficheVehicule(Vehicule const& a)
{
    a.afficher();
}
Sans plus de résultat. À chaque fois la boucle l.44-48 de main.cpp m'affiche tout comme si le tableau ne contenait que des Vehicule.

Merci d'avance pour votre aide !