Le polymorphisme pour les objets : les fonctions virtuelles
 
 
 

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:
//
};
 

Il faut noter la syntaxe incompréhensible " = 0" qui signifie non pas que la valeur de la fonction est nulle, mais que la fonction est purement virtuelle. Dans la classe dérivée Triangleequilateral, la fonction surface recevra une implémentation.
   
 
 
Drupal 7 Appliance - Powered by TurnKey Linux