Rappel :
- héritage pour réutiliser le code d’une classe mère dans une classe fille
- la relation entre la classe fille et la classe mère est de type "est un"
- la classe fille hérite de l’interface (méthodes publiques) et de l’implémentation (membres déclarés comme protected) de sa classe mère.
Le polymorphisme, c’est utiliser les fonctionnalitées implémentées dans les classes filles à partir de l’interface commune de la classe mère.
class Animal{
public :
void affiche() const {
cout << "Je suis un animal." << endl;
}
};
class Chien: public Animal{
public :
void affiche() const {
cout << "Je suis un chien." << end;
}
};
class Chat: public Animal{
public :
void affiche() const {
cout << "Je suis un chat." << endl;
}
};
void presenter(Animal a) {
a.affiche();
}
int main(){
Chat c;
presenter(c); //affiche "Je suis un animal."
return 0;
}- Par défaut, c'est le type de la variable qui détermine quelle fonction membre appeler et pas sa vraie nature.
- Pour pouvoir appeler la méthode correspondant à la vraie nature de l’objet, il faut :
- Utiliser un pointeur ou une référence
- Utiliser des méthodes virtuelles avec le mot clé virtual. Ce mot clé n’est à rajouter que dans le fichier d’entête (.h)
- Toute fonction déclarée virtuelle dans la classe mère est automatiquement virtuelle dans toute la hiérarchie
class Animal{
public :
virtual void affiche() const {
cout << "Je suis un animal." << endl;
}
};
class Chien: public Animal{
public :
virtual void affiche() const {
cout << "Je suis un chien." << endl;
}
};
class Chat: public Animal{
public :
virtual void affiche() const {
cout << "Je suis un chat." << endl;
}
};
void presenter(Animal const& a) {
a.affiche();
}
int main(){
Chat c;
presenter(c); //affiche "Je suis un chat."
return 0;
}- Toutes les méthodes peuvent être virtuelles exceptés les constructeurs. On ne peut pas non plus appeler de méthodes virtuelles dans le constructeur
- Une classe qui a au moins une méthode virtuelle, ou qui hérite d’une classe qui en possède une, doit déclarer son destructeur comme virtuel
- Il n’est pas bon de déclarer automatiquement les destructeurs comme virtuels si l’on n’utilise pas le polymorphisme car plus coûteux en ressources.