Dans cette page, je rentre dans le vif du sujet :

c'est la programmation objet, et l'encapsulation.

L'encapsulation d'un objet dans une classe, est souvent appellé un type de donnée abstraite.

Nous avons déja signalé, que la notion de classe permet d'avoir une plus grande sécurité, pour la création et l'exécution des applications.

La notion de classe dérivée, permet de simplifier la programmation, tout en conservant cette grande sécurité. Elle permet en effet de se servir d'une classe de base, encore appelée parent, sans risquer de l'abimer.

Une classe dérivée, encore appelée enfant de la classe de base, hérite de toutes les propriétés et méthodes publiques et protégées de la classe de base. Cela permet de les utiliser sans recommencer leur implémentation.

On ajoutera simplement, dans une classe dérivée, ces champs personnels, pour lesquels l'implémentation sera faite, en bénéficiant de l'héritage de la classe parent.

Consultez l'exemple suivant :

heritage.cpp : exemple simple d'une classe dérivée d'une classe de base

En résumé, la notion de classe dérivée d'une classe de base, est importante pour les applications, car elle permet d'utiliser en toute sécurité, les méthodes publiques ou amies de la classe de base, ainsi que les champs protégés.

On peut alors personnaliser une classe de base, pouren faire une classe dérivée, qui hérite des propriétés et méthodes de celle-ci, et qui ne demande que peu de lignes de code, pour s'adapter aux besoins personnels.

Cette technique de programmation est très souvent utilisée, pour créer des applications pour windows.

Les objets windows de la bibliothéque owl en sont un bon exemple.

Consultez les exemples que vous trouverez dans bc5\examples\owl, si vous possédez la version bc5 de borland.

De même les composants windows (ocf object component fondation) utilisent des classes dérivées, pour faciliter la création d'ole (object linking embedding)

Les applications ole sont intéressantes, car elles peuvent faire passer des données d'un composant à un autre. On parle aussi d'applications client / seurveur

Mais ne vous lancez pas tout de suite dans la création de telles applications, qui nécessitent une bonne pratique du c++

Comme vous l'avez constaté dans le fichier heritage.cpp, la syntaxe, pour la déclaration d'une classe D, qui dérive d'une classe de base B, est :

class D : public B { ... };

On peut dériver une classe de plusieurs classes de base. On parle alors d'héritage multiple.

La syntaxe pour l'heritage multiple est :

class d : public a , public b { ... };

L'héritage est transitif, c'est à dire, une classe de base peut donner des classes dérivées, qui sont des classes de bases pour d'autres classes dérivées. Il faut alors faire des arbres analogiques, pour s'y retrouver dans leurs liens de parentés.

Le lien suivant vous donne un exemple d'héritage multiple, qui va nous servir par la suite, pour commenter la notion de classe ou de fonction virtuelle.

herimult.cpp : exemple d'héritage multiple

L'héritage multiple peut conduire à des ambiguïtés, quand un champ peut provenir d'une même classe, par des héritages différents.

Par exemple, si aa dérive de a et ab dérive de a, et si bb dérive de aa et de ab, un constructeur de bb venant de a par ab, ou venant deab, n'aura pas la même référence.

Pour éviter toute confusion, on utilise l' instruction virtual

Je vais expliquer cela, en précisant comment l'on manipule les adresses des champs d'une classe, avec un pointeur sur les objets de la classe.

Quand on fait pointer un pointeur sur un membre d'un objet d'une classe, celui-ci contient l'adresse de ce membre. Il n'y aura pas d'ambiguïté si le compilateur affecte des adresses différentes aux fonctions différentes, ce que permettra l'instruction virtual.

Dans les liens suivants, vous trouverez des sources qui vous éclaireront sur l'instruction virtual, pour des classes virtuelles, ou pour des fonctions virtuelles.

virtual.cpp : exemple d'utilisation d'une classe virtuelle

virtual2.cpp : exemple d'utilisation d'une fonction virtuelle

Ceci termine les notions de base sur le c++

suivant : cours 6 conclusions

retour au sommaire du cours cpptutor