INITIATION A LAPROGRAMMATION ORIENTEE OBJET ET A C++ 1 Départ de Génie Electrique Faculté des Sciences et Téchniques de BENI MELLAL Départ de Génie Electrique Faculté des Sciences et Téchniques de BENI MELLAL Sommaire 2 Introduction Approche orientée objet Création et lancement d’un projet La syntaxe du C Les classes Syntaxe C++ Application Départ de Génie Electrique Faculté des Sciences et Téchniques de BENI MELLAL Introduction 3 Langages linéaires Les lignes du programme sont exécutées d’une manière séquentielle. Par exemple le fortran et l’assembleur. Langages modulaires Regroupement d’un ensemble d’instructions dans des fonctions ou procédures. Le langage c fait partie de ces langages. Langages orientés objets La méthode orientée objet est en fait une évolution de l’approche modulaire . A. ABOUNADA Départ de Génie Electrique Faculté des Sciences et Téchniques de BENI MELLAL Approche orientée objet D’un point de vue général la construction d’un système informatique se résume par la formule: Algorithmes + Structures de données = Programme Le concepteur d’un système informatique a donc deux grandes options pour l’architecture d’un programme: 4 Départ de Génie Electrique Faculté des Sciences et Téchniques de BENI MELLAL 10 mars 2008 Les méthodes de conception par traitements: Ces méthodes constituent l’approche traditionnelle, la base de la réflexion est effectuée sur les traitements, le concepteur considère ainsi les tâches que doit accomplir le programme. Remarque: – 5 Les modules utilisés sont souvent adaptés au type de problèmes posés au départ et ne permettant que peu d’extensibilité du système obtenu et que peu de réutilisabilité. Départ de Génie Electrique Faculté des Sciences et Téchniques de BENI MELLAL 10 mars 2008 6 Les méthodes de conception par objet: la conception par objet trouve ses fondements dans une réflexion menée autour de la vie et la qualité du logiciel. Ceci peut être atteint à travers certains critères: – La correction ou la validité. – L’extensibilité. – La réutilisabilité. – La robustesse Départ de Génie Electrique Faculté des Sciences et Téchniques de BENI MELLAL 10 mars 2008 La conception orientée objet est basée principalement sur trois aspects primordiaux: 7 L’encapsulation: cette technique permet de réunir des variables et des fonctions (méthodes) au sein d’une même entité nommée classe. l’accès aux données et fonctions peut être réglementé. L’héritage: cette technique permet de définir une hiérarchie de classe. Chaque classe fille hérite des méthodes et des données de ses mères. Le polymorphisme: cette caractéristique offre la possibilité de définir plusieurs fonctions de même nom mais possédant des paramètres différents. Départ de Génie Electrique Faculté des Sciences et Téchniques de BENI MELLAL Création et lancement d’un projet Un environnement de développement intégré (EDI) 1, est un logiciel regroupant un ensemble d'outils nécessaires au développement logiciel dans un (ou plusieurs) langage(s) de programmation. Outils inclus au minimum dans un EDI : un éditeur de texte spécialisé (avec coloration syntaxique, indentation automatique, complétion automatique, . . . ), un compilateur. un débogueur. 8 des outils d'automatisation de la compilation et de gestion de projets. Départ de Génie Electrique Faculté des Sciences et Téchniques de BENI MELLAL Visuel C++ fonctionne suivant les notions de "Projet" et "Espace de travail", comme désormais la plupart des environnements de programmation intégrés (MPLAB, CodeComposer ...) Un projet contient des informations plus techniques relatives à la programmation. C'est dans ce fichier que seront stockés les noms des fichiers présents, les librairies utiles, etc. 9 Départ de Génie Electrique Faculté des Sciences et Téchniques de BENI MELLAL 10 mars 2008 Étapes pour la création d’un projet sous Visuel c++: un projet fera partie automatiquement d'un espace de travail par défaut. Pour le créer on choisi le menu "File" puis "Nouveau". Vous arrivez alors devant la boîte de dialogue suivante: 10 10 mars 2008 11 Départ de Génie Electrique Faculté des Sciences et Téchniques de BENI MELLAL Départ de Génie Electrique Faculté des Sciences et Téchniques de BENI MELLAL Vous pouvez remarquer la présence de quatre onglets différents : Files, Projects, Workspaces et Other Documents. pour l'instant nous allons juste créer un projet pour la compilation de code C++. Pour cela, choisissez l'onglet "Projects" . puis cliquez sur le 10ème choix de la liste : "Win32 Console Application". Visual C++ permet en effet d'effectuer de nombreux types de programmes différents, comme par exemple: des librairies, des applications Windows classiques des programmes qui s'exécutent en mode "Dos" (fenêtre Dos). 12 Départ de Génie Electrique Faculté des Sciences et Téchniques de BENI MELLAL Vous pouvez alors entrer un nom pour votre projet dans la boîte d'édition "Project Name" et la localisation physique de votre projet sur le disque dur, dans "Location". Vous pouvez alors appuyer sur "Ok". Visual C++ se charge alors de créer pour vous tout l'environnement de base, nécessaire à la réalisation de votre programme. Bien sûr, dans notre cas "d'application console", il ne vous crée aucun fichier de code : c'est à vous de jouer ! 13 Départ de Génie Electrique Faculté des Sciences et Téchniques de BENI MELLAL 14 Départ de Génie Electrique Faculté des Sciences et Téchniques de BENI MELLAL Compilation et exécution: Votre projet est créé, il ne vous reste "plus" qu'à l'étoffer avec quelques lignes de code... Pour cela, nous allons commencer par un programme très simple en langage C. Tout d'abord, créons un nouveau fichier. Pour cela, vous devez appuyer sur le bouton "New" de la barre d'outils (image de gauche). Vous vous retrouvez alors avec une nouvelle fenêtre ouverte vide sans titre. Faites un "Save" ou "Save As" du menu "Files" ou bien cliquez sur le bouton correspondant. Pour notre exemple, appelons le "main.c". 15 Départ de Génie Electrique Faculté des Sciences et Téchniques de BENI MELLAL Deux compilations différentes : compilez le fichier courant seul (« Ctrl+F7"). compilez le projet dans sa globalité ("F7"). C'est la deuxième qui permet la génération d'un exécutable. Il est également toujours possible d'accéder à ces actions, par l'intermédiaire du menu "Build" de l'interface, ou encore par le bouton correspondant. L’exécution se fait en sélectionnant "Execute MyProject.exe" (Ctrl+F5). Une fenêtre Dos s'affiche alors : elle contient les sorties du programme que vous venez d’écrire. 16 Départ de Génie Electrique Faculté des Sciences et Téchniques de BENI MELLAL Exemple: #include <stdio.h> void main() { int i; printf( "Debut boucle\n" ); for( i=0; i<20; i++ ) { printf( "*" ); } printf( "\nFin boucle\n" ); } 17 Départ de Génie Electrique Faculté des Sciences et Téchniques de BENI MELLAL Le debugger : Il est possible de "tracer" un programme. Cela consiste à l'exécuter ligne par ligne, expression après expression. Pour ce faire, il y a plusieurs solutions. La première fonctionne suivant la technique des "Breakpoints" : on place un point d'arrêt quelque part dans le code (Ctrl+B, cf. Figure 6), à une ligne donnée (en fait, la ligne courante du curseur de texte). 18 10 mars 2008 19 Départ de Génie Electrique Faculté des Sciences et Téchniques de BENI MELLAL On lance alors l'exécution en mode Debug F5), et le programme s'arrête automatiquement à l'endroit voulu. Il est alors possible de tracer le programme ligne par ligne (F10 ou F11), ou bien de le relancer jusqu'à la fin ou le prochain point d'arrêt. Départ de Génie Electrique Faculté des Sciences et Téchniques de BENI MELLAL 10 mars 2008 La seconde solution consiste à ne pas mettre de breakpoint, mais à exécuter un programme jusqu'à une ligne donnée. Cette possibilité est offerte par Visual grâce à « run to Cursor" (Ctrl+F10) Il est plus intéressant de suivre l'état des variables du programme. Pour cela, vous pouvez vous servir de la barre qui s'affiche en bas de l'interface de Visual en mode debuggage 20 10 mars 2008 Départ de Génie Electrique Faculté des Sciences et Téchniques de BENI MELLAL il suffit d'effectuer un glisser-déposer des variables à visualiser 21 Départ de Génie Electrique Faculté des Sciences et Téchniques de BENI MELLAL 10 mars 2008 Vous pouvez également avoir accès au contenu d'une variable en cliquant sur elle à l'aide du bouton droit de la souris, puis "Quickwatch". 22 Départ de Génie Electrique Faculté des Sciences et Téchniques de BENI MELLAL Le langage C 23 Considérons le programme ci-dessous : Départ de Génie Electrique Faculté des Sciences et Téchniques de BENI MELLAL #include <stdio.h> void affiche_calcul(float,float); /* prototype */ float produit(float,float); Int varglob; int main(void) { float a,b; /* déclaration locale */ varglob=0; puts ("veuillez entrer 2 valeurs"); scanf("%f %f",&a,&b); affiche_calcul (a,b); printf("nombre d'appels à produit : %d\n",varglob); } float produit (float r, float s) { varglob++; return(r*s); } void affiche_calcul (float x,float y) { float varloc; varloc=produit(x,y); varloc=produit(varloc,varloc); printf("le carré du produit est %f\n",varloc); } 24 Départ de Génie Electrique Faculté des Sciences et Téchniques de BENI MELLAL Syntaxe du C Un programme C est composé: de directivess du pré-processeur, commençant par #, terminées par un retour à la ligne (pas de ;). Dans l'exemple il y en a une. de déclarations globales (terminées par un ;). Ici on en a trois, deux prototypes et une variable globale. d'une suite de fonctions, écrites les unes après les autres (sans imbrication comme on le ferait en Pascal). Ici il y en a 3 : main, produit et affiche_calcul. 25 Départ de Génie Electrique Faculté des Sciences et Téchniques de BENI MELLAL Les commentaires Syntaxe : Les commentaires débutent par /* et se terminent par */. Ou par // dans le cas d’une seule ligne Exemple : /* Ceci est un commentaire */ // Ceci est un commentaire 27 Départ de Génie Electrique Faculté des Sciences et Téchniques de BENI MELLAL Les types de base Les caractères Les entiers Les flottants 28 Départ de Génie Electrique Faculté des Sciences et Téchniques de BENI MELLAL 10 mars 2008 Les caractères Le mot-clé désignant les caractères est char. Un objet de ce type doit pouvoir contenir le code de n'importe quel caractère de l'ensemble des caractères utilisé sur la machine. 29 Départ de Génie Electrique Faculté des Sciences et Téchniques de BENI MELLAL 10 mars 2008 Les entiers Le mot clé désignant les entiers est int. Les entiers peuvent être affectés de deux types d'attributs : un attribut de précision et un attribut de représentation attribut de précision : short et long. on peut avoir trois types d'entiers : short int, int et long int attribut de représentation : unsigned. on peut avoir deux types d'entiers : int et unsigned int six types d'entiers : int, short int, long int (tous trois signés) et unsigned int, unsigned short int et unsigned long int. 30 Départ de Génie Electrique Faculté des Sciences et Téchniques de BENI MELLAL 10 mars 2008 Les flottants Il existe trois types de flottants correspondants à trois précisions possibles. En allant de la précision la plus faible vers la plus forte, on dispose des types float, double et long double. 31 Départ de Génie Electrique Faculté des Sciences et Téchniques de BENI MELLAL 10 mars 2008 32 type taille (en bits) char 8 -128 à +127 unsigned char 8 0 à 255 short (short int) 16 -32768 à 32767 unsigned short 16 0 à 65535 long (long int) 32 -2.147.483.648 à 2.147.483.647 unsigned long 32 0 à 4.294.967.295 float 32 -3.4e38 à 3.4e38 (7 chiffres significatifs) double (long float) 64 -1.7e308 à 1.7e308 (15 chiffres significatifs) long double (non standard) 80 ou 128 plage de valeurs ça dépend Départ de Génie Electrique Faculté des Sciences et Téchniques de BENI MELLAL Les constantes 33 Les constantes entières Les constantes caractères Les constantes flottantes Les chaînes de caractères littérales Départ de Génie Electrique Faculté des Sciences et Téchniques de BENI MELLAL 10 mars 2008 Les constantes entières On dispose de 3 notations pour les constantes entières : décimale, octale et hexadécimale. – – – Les constantes décimales (ex : 372). Les constantes octales doivent commencer par un zéro et ne comporter que des chiffres octaux (ex : 0477). Les constantes hexadécimales Elles doivent commencer par 0x ou 0X et être composées des chiffres de 0 à 9, ainsi que des lettres de a à f (ex : 0x5a2b, 0X5a2b, 0x5A2B). Une constante entière peut être suffixée par la lettre u ou U Elle peut également être suffixée par la lettre l ou L. 34 Départ de Génie Electrique Faculté des Sciences et Téchniques de BENI MELLAL 10 mars 2008 Les constantes caractères Une constante caractère s'écrit entourée du signe '. par exemple, la constante caractère correspondant au caractère g s'écrit 'g'. Les constantes flottantes La notation utilisée est la notation classique par mantisse et exposant. La mantisse est composée d'une partie entière suivie du signe . (point) suivi de la partie fractionnaire. La partie entière et la partie fractionnaire sont exprimées en décimal et l'une ou l'autre peuvent être omises. 35 Départ de Génie Electrique Faculté des Sciences et Téchniques de BENI MELLAL 10 mars 2008 Les chaînes de caractères littérales Une chaîne de caractères littérale est une suite de caractères entourés du signe ". Exemple : "ceci est une chaîne " 36 Départ de Génie Electrique Faculté des Sciences et Téchniques de BENI MELLAL Les constantes nommées Les #define Les énumérations 37 Départ de Génie Electrique Faculté des Sciences et Téchniques de BENI MELLAL 10 mars 2008 • Les #define Exemple: #define PI 3.14159 dans la suite du programme on pourra utiliser le nom PI pour désigner la constante 3.14159. 38 Départ de Génie Electrique Faculté des Sciences et Téchniques de BENI MELLAL 10 mars 2008 Les énumérations On peut définir des constantes de la manière suivante : enum { liste-d'identificateurs } Exemples : enum {LUNDI, MARDI, MERCREDI, JEUDI, VENDREDI, SAMEDI, DIMANCHE}; définit les identificateurs LUNDI, ... DIMANCHE comme étant des constantes de type int, et leur donne les valeurs 0, 1, ... 6. enum {FRANCE = 10, LUXEMBOURG, BELGIQUE, ESPAGNE = 20, ITALIE = 30}; donnera la valeur 11 à LUXEMBOURG et 12 à BELGIQUE. 39 Départ de Génie Electrique Faculté des Sciences et Téchniques de BENI MELLAL Structures de contrôle 1. Boucles Les boucles sont la solution à employer pour effectuer plusieurs fois la même instruction (ou un bloc d'instructions). For (pour) While (tant que) Do While (faire tant que) 2. Branchements conditionnels If - Else (Si - Sinon) Switch - Case 40 (brancher - dans le cas) Départ de Génie Electrique Faculté des Sciences et Téchniques de BENI MELLAL 10 mars 2008 3. Branchements inconditionnels Break (interrompre) Continue (continuer) Goto (aller à) Return (retourner) Exit (sortir) 41 Départ de Génie Electrique Faculté des Sciences et Téchniques de BENI MELLAL Les pointeurs Notion de pointeur Une valeur de type pointeur repère une variable. En pratique, cela signifie qu'une valeur de type pointeur est l'adresse d'une variable. 42 Départ de Génie Electrique Faculté des Sciences et Téchniques de BENI MELLAL 10 mars 2008 Exemples : int *pi; pi est un pointeur vers un int short int *psi; psi est un pointeur vers un short int double *pd; pd pointeur vers un flottant double précision char *pc; pc pointeur vers un char 43 Départ de Génie Electrique Faculté des Sciences et Téchniques de BENI MELLAL 10 mars 2008 Opérateur adresse L'opérateur & appliqué à une variable délivre l'adresse de celle-ci ; cette adresse pourra être affectée à une variable de type pointeur. par exemple : int i; int *pi; pi = &i; le pointeur pi repère la variable i 44 Départ de Génie Electrique Faculté des Sciences et Téchniques de BENI MELLAL 10 mars 2008 Opérateur d'indirection il délivre la valeur pointée. par exemple : int i; int *pi; pi = &i; *pi = 2; j = *pi + 1; une utilisation de la valeur pointée par pi 45 Départ de Génie Electrique Faculté des Sciences et Téchniques de BENI MELLAL 10 mars 2008 Exercice 1. Déclarer un entier i et un pointeur p vers un entier ; 2. Initialiser l'entier à une valeur arbitraire et faire pointer p vers i ; 3. Imprimer la valeur de i ; 4. Modifier l'entier pointé par p (en utilisant p, pas i) ; 5. Imprimer la valeur de i. 46 Départ de Génie Electrique Faculté des Sciences et Téchniques de BENI MELLAL 10 mars 2008 Une solution possible est donnée par: #include <stdio.h> void main() { int i; int *p; i = 1; p = &i; printf("valeur de i avant: %d\n",i); *p = 2; printf("valeur de i après: %d\n",i); } 47 Départ de Génie Electrique Faculté des Sciences et Téchniques de BENI MELLAL 10 mars 2008 Passage de paramètres 50 passer une valeur qui sera exploitée par l'algorithme de la procédure (exemple sin(x)). Une telle façon de passer un paramètre s'appelle le passage par valeur passer une référence d’une variable, de manière à permettre à la procédure de modifier la valeur de cette variable. Une telle façon de passer un paramètre s'appelle le passage par adresse. Départ de Génie Electrique Faculté des Sciences et Téchniques de BENI MELLAL 10 mars 2008 Etapes pour le passage par référence de paramètres 51 1. Dans la liste du prototype et de la définition de la fonction, on déclare le paramètre avec l’opérateur d’indirection (*). 2. En passant un paramètre, vous passez une adresse en appliquant l’opérateur adresse (&). 3. Dans la définition de la fonction, appliquez l’opérateur pointeur d’indirection chaque fois que vous voulez accéder aux données. Départ de Génie Electrique Faculté des Sciences et Téchniques de BENI MELLAL 10 mars 2008 52 Exemples : #include <stdio.h> void double_val(int *p); void main() { int i; double_val(&i); printf(“le résultat est: %d”,i); } void double_val ( int *p); { *p=*p * 2; } Départ de Génie Electrique Faculté des Sciences et Téchniques de BENI MELLAL Les classes Un objet est constitué d’attributs qui caractérisent la structure de celui-ci. L'objet est manipulé par des procédures appelées méthodes. L'ensemble des propriétés d'un objet (attributs et méthodes) constitue un ensemble appelé classe. 53 les objets: • Un objet est une entité informatique comprenant : – des données membres (ou champs ou attributs ou variables d’instances) – des fonctions membres (ou méthodes ou routines) Données membres Fonctions membres Exemple: Classe ARTICLE attributs de l'objet : Référence, Désignation, Prix Unitaire et Quantité . Nous pouvons définir comme méthodes de l'objet article Prix Ttc : Méthode permettant de calculer le prix TTC d'un article Sortie Article : Méthode permettant de diminuer la quantité en stock Entrée Article : Méthode permettant d'augmenter la quantité en stock 56 Objet : exemples Articles m_référence m_désignation m_prix m_quntité Calculprix() Stock() Alimenter stock() quatitéstock() Nom de la classe Données membres ou attributs Fonctions membres ou méthodes CompteBancaire m_numéro m_solde m_propriétaire Créditer() Débiter() Fermer() Numéro() Solde() Propriétaire() Propriétés d’un objet Un objet possède un état : L’état correspond à la valeur de ses attributs à un instant donné. Il peut varier au cours du temps. Un objet est décrit par une classe : Une classe est un prototype qui définit des attributs et des méthodes communes à tous les objets d'une certaine nature. C’est donc un modèle utilisé pour créer plusieurs objets présentant des caractéristiques communes. Deux objets peuvent être distincts même si tous leurs attributs ont des valeurs identiques. • Classe : interface d’une classe protected : float m_cX, m_cY; float m_a, m_b; public : void deplace(float dx, float dy); void zoom(float z); float surface(); les coordonnées du centre (cX, cY), a grand axe et b petit axe . • Visibilité des membres : – public : membres accessibles à tous – private : membres accessibles à partir de la classe ; accès impossible par l’extérieur – protected : membres accessibles à partir de la classe et des classes dérivées ; accès impossible par l’extérieur Classe : implantation Interface de la classe Ellipse class Ellipse { protected : float m_cX, m_cY; float m_a, m_b; public : void deplace(float dx, float dy); void zoom(float z); float surface(); }; définition des fonctions associées void Ellipse::deplace(float dx, float dy) { m_cX += dx; m_cY += dy; } void Ellipse ::zoom(float z) { m_a *= z; m_b *= z; } float Ellipse ::surface() { return 3.14 * m_a * m_b / 4.; } 63 :: est l’Opérateur de portée Classe : instanciation Interface de la classe Ellipse class Ellipse { protected : float m_cX, m_cY; float m_r; public : void deplace(float dx, float dy); void zoom(float z); float surface(); }; Implantation de la classe Ellipse void Ellipse::deplace(float dx, float dy) { m_cX += dx; m_cY += dy; } void Ellipse::zoom(float z) { m_a *= z; m_b *= z; } float Ellipse::surface() { return 3.14 * m_a * m_b / 4.; } Instancier une classe permet de créer un objet (analogue à une déclaration de variable) Instanciation statique de l’objet e, e étant une variable de type Ellipse int main() { Ellipse e; Accès aux membres par le "." e.deplace(50, 0); float s = e.surface(); e.zoom(1.5); e.m_cX = 30; Impossible e. deplace(20); Impossible } 65 // // Organisation des fichiers ellipse.h class Ellipse { protected : float m_cX, m_cY; float m_a, m_b; public : void deplace(float dx, float dy); void zoom(float z); float surface(); }; ellipse.cpp main.cpp #include “ellipse.h” #include "ellipse.h" void Ellipse::deplace(float dx, float dy) { m_cX += dx; m_cY += dy; } void Ellipse ::zoom(float z) { m_a *= z; m_b *= z; } float Ellipse :: surface() { return 3.14 * m_a * m_b / 4.; } int main() { Ellipse e; e.deplace(50, 0); float s = e.surface(); e.zoom(1.5); return 0; } Remarques: • Par convention, l'extension d'un fichier contenant du code C est .cpp, c, cc ... • L'extension d'un fichier de déclarations, appelé header, est .h • Par convention, on crée un fichier .cpp et un .h par classe, chaque fichier ayant le nom de la classe en minuscule. • Par convention, les noms de classe commencent par une majuscule, les données membres par _ ou m_, les fonctions membres par une minuscule. 67 Constructeurs de classe Le constructeur est une fonction membre qui sert à initialiser les données membres de l’objet Systématiquement appelée quand une instance de classe est créée. N’a pas de type de retour Porte le nom de la classe Un constructeur sans argument est un constructeur par défaut. Un constructeur doit être déclaré avec le mot clé public. Destructeur de classe 69 Le destructeur est une fonction membre systématiquement appelée juste avant la destruction d’un objet Porte le nom de la classe et est précédé de ~ Pas de type de retour Pas d’arguments Un seul par classe Permet de détruire l’objet et libérer la mémoire. Pointeurs vers des objets Comme dans le cas des pointeurs vers des variables, on peut aussi utiliser des pointeurs vers des objets. Ceci permet de créer des objets de façon dynamique. C++ possède les opérateurs new et delete pour la création dynamique d’objets. L’opérateur new retourne un pointeur. Chaine *pChaine; pChaine= new Chaine; . . . delete pChaine 70 Surcharge d’opérateurs La surcharge est un autre concept important de C++, la surcharge utilise le type pour distinguer la manière d’opérer les fonctions et des opérateurs. Surcharger c’est réutiliser un nom de fonction ou d’opérateur. Les fonctions surchargées sont complètement distinctes les unes des autres et ont des définitions et des déclarations différentes. Exemples: Constructeurs d’une classe. Opérateurs + , - ,x, assignement(=). 71 Exemple: ellipse.h class Ellipse { public : Ellipse(); // Constructeur par défaut Ellipse (float x, float y, float a, float b); Ellipse(const Ellipse & e); ~Ellipse(); // Destructeur ellipse.cpp #include “ellipse.h” prog.cpp Ellipse::Ellipse() { m_cX = m_ cY = 0; m_a = m_b = 1; } int main() { Ellipse e; Ellipse* pE = new Ellipse(2.5, 6.5, 12, 15); #include "ellipse.h" etc … protected : float m_cX, m_cY; float m_a, m_b; Ellipse::~ Ellipse() { // Libération des ressources } public : void deplace(float dx, float dy); void zoom(float z); float surface(); }; void Ellipse::deplace(float dx, float dy) { m_cX += dx; m_cY += dy; } etc … delete pE; // appelle le destructeur pour pE return 0; // Le destructeur est implicitement appelé pour e. } Héritage • L’héritage permet de former une nouvelle classe à partir de classes existantes. • La nouvelle classe (classe fille, sous-classe) hérite des attributs et des méthodes des classes à partir desquelles elle a été formée (classes mères, super-classes). • De nouveaux attributs et de nouvelles méthodes peuvent être définis dans la classe fille. • Des méthodes des classes mères peuvent être redéfinies dans la classe fille. 73 Exemple: Un cercle est un spécialisation d'une ellipse, il en possède les propriétés plus d'autres qui lui sont spécifiques. On dérive donc la classe Cercle de la classe Ellipse. Forme Ellipse Cercle Rectangle Carre Héritage ellipse.h class Ellipse { public : Ellipse(); Ellipse (float x, float y, float a, float b); Ellipse(const Ellipse & e); ~Ellipse(); protected : float m_cX, m_cY; float m_a, m_b; public : void deplace(float dx, float dy); void zoom(float z); float surface(); Autorise la virtual void affiche(); redéfinition de }; la fonction dans les classes ellipse.cpp dérivées #include <stdio.h> void Ellipse::affiche() { // Code pour afficher l’ellipse. } Définitions des autres fonctions cercle.h prog.cpp #include “ellipse.h” #include "cercle.h" class Cercle : public Ellipse { public : Cercle(); Cercle (float x, float y, float diametre); ~ Cercle(); public : virtual void affiche(); }; int main() { Cercle c(5, 5, 15); c. affiche(); return 0; } cercle.cpp #include <stdio.h> #include “cercle.h” Le constructeur de la classe dérivée appelle généralement un des constructeurs de la classe de base. Cercle::Cercle() : public Ellipse() { } Cercle::Cercle(float x, float y, float diametre) : public Ellipse( x, y, diametre, diametre) { } void Cercle::affiche() { // code pour afficher le cercle . }