Skip to content

Latest commit

 

History

History
85 lines (70 loc) · 2.46 KB

File metadata and controls

85 lines (70 loc) · 2.46 KB

Polymorphisme

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.