Exemple:
class
Triangle {
public
:
virtual
float surface(); // un prototype
de fonction implémenté par ailleurs
private:
//
};
class
Triangleequilateral : public Triangle {
public:
float
surface() { return 0.25*sqrt(3.)*a*a; }
private:
float
a;
};
...
Triangle
*ptri;
Triangle
t; Triangleequilateral t2; float s;
ptri=&t; s=ptri->surface(); // le pointeur pointe sur un Triangle, appel de la fonction surface de la classe Triangle
// mais
ptri=&t2; s=ptri->surface();
// le pointeur peut également pointer sur un Triangleequilateral,
// et grace au mot cle virtual devant la fonction surface de la classe mère
// c'est
maintenant la fonction surface de la classe
Triangleequilateral
qui est appelée
On a ici un nouvel exemple de polymorphisme, après la surcharge des fonctions. Ici (grâce au mot clé virtual ) la méthode appliquée sur un objet désigné par un pointeur dépend du type de l'objet.
Une méthode peut également être purement virtuelle, c'est à dire ne pas avoir d'implémentation, auquel cas la classe est dite abstraite: on ne pourra pas créer d'objet de cette classe, mais seulement de classes dérivées, qui devront fournir une implémentation de la fonction virtuelle.
class
Triangle {
public
:
virtual
float surface() = 0 ; // une
fonction
purement virtuelle
private:
//
};