Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Apprendre Méthode Virtuelle Pure | Aperçu du Polymorphisme
Programmation Orientée Objet en C++
course content

Contenu du cours

Programmation Orientée Objet en C++

Programmation Orientée Objet en C++

1. Fondamentaux de la POO en C++
2. Constructeurs et Destructeurs
3. Aperçu de l'Encapsulation
4. Aperçu de l'Héritage
5. Aperçu du Polymorphisme

book
Méthode Virtuelle Pure

Le concept de méthodes virtuelles est essentiel pour atteindre le polymorphisme, permettant une conception logicielle flexible et extensible. Les méthodes virtuelles pures vont plus loin en définissant des interfaces et en prenant en charge la liaison dynamique.

Syntaxe d'une méthode virtuelle pure

Une méthode virtuelle pure est déclarée avec le mot-clé virtual et initialisée à zéro. Cela indique que la fonction n'a pas de définition dans la class et doit être redéfinie par toute sous-classe avant que des objets de cette class puissent être instanciés.

virtual.h

virtual.h

copy
1
virtual void example() = 0;

Cette méthode fonctionne de manière similaire à une méthode standard, à l'exception qu'elle ne possède pas de corps délimité par { } et se termine par = 0;, indiquant ainsi l'absence d'implémentation. Cependant, les autres règles pour cette méthode sont identiques à celles des méthodes ordinaires.

Déclarer une méthode virtuelle pure rend la class dans laquelle elle est déclarée abstraite, ce qui signifie qu'il devient impossible d'instancier des objets de cette classe. Cette restriction existe car chaque méthode de la class doit être implémentée avant de créer et d'utiliser une instance, afin de prévenir les erreurs et les comportements imprévisibles. Examinez le code ci-dessous :

Animal.h

Animal.h

copy
1234
class Animal { public: virtual void speak() = 0; };

La Animal class comporte une méthode virtuelle pure nommée speak(), empêchant l'instanciation d'objets à partir de cette classe. Cette conception est logique, car l'objectif de la méthode virtuelle est de représenter les sons distinctifs produits par chaque animal.

En rendant la méthode virtuelle, chaque sous-classe peut fournir sa propre implémentation, reflétant l'individualité du son de chaque animal. La déclaration en tant que virtuelle pure indique qu'aucune implémentation par défaut n'existe, soulignant la nécessité d'implémentations concrètes dans les classes dérivées.

main.cpp

main.cpp

copy
1234567
#include "Animal.h" int main() { // cannot declare variable 'animal' to be of abstract type Animal animal; }

Cela est également cohérent. Créer des instances de la Animal class serait impraticable et contre-intuitif, car elle représente un concept abstrait servant de catégorie pour différents animaux. Aucun comportement spécifique n'est associé à un animal générique, ce qui renforce le caractère abstrait de la class et met en avant l'importance de créer des sous-classes spécialisées pour représenter les sons uniques de chaque animal spécifique.

main.cpp

main.cpp

copy
12345678910111213141516171819202122232425262728293031
#include <iostream> class Animal { public: // Pure virtual function to enforce implementation in derived classes virtual void speak() = 0; }; class Cat : public Animal { public: void speak() override { std::cout << "Meow!" << std::endl; } }; class Dog : public Animal { public: void speak() override { std::cout << "Bark!" << std::endl; } }; class Cow : public Animal { public: void speak() override { std::cout << "Moo!" << std::endl; } }; void pet(Animal& animal) { animal.speak(); } int main() { // Replace `Cat` with `Dog` or `Cow` to see their specific behavior Cat cat; pet(cat); }

Bien qu'il ne soit pas possible de créer un objet de type Animal directement, il est tout de même possible de l'utiliser comme paramètre dans une fonction. À l'instar de l'exemple précédent avec le bouton, cette approche exploite le polymorphisme pour concevoir un programme polyvalent capable de modifier dynamiquement son comportement à l'exécution.

Note
Remarque

Essayez de passer un objet d'une autre class à la fonction et observez le résultat. Essayez également de créer un objet de la class abstraite afin de constater comment le compilateur empêche l'instanciation en raison de méthodes virtuelles pures non implémentées.

question mark

Que se passe-t-il lorsqu'une classe contient une méthode virtuelle pure ?

Select the correct answer

Tout était clair ?

Comment pouvons-nous l'améliorer ?

Merci pour vos commentaires !

Section 5. Chapitre 3

Demandez à l'IA

expand

Demandez à l'IA

ChatGPT

Posez n'importe quelle question ou essayez l'une des questions suggérées pour commencer notre discussion

course content

Contenu du cours

Programmation Orientée Objet en C++

Programmation Orientée Objet en C++

1. Fondamentaux de la POO en C++
2. Constructeurs et Destructeurs
3. Aperçu de l'Encapsulation
4. Aperçu de l'Héritage
5. Aperçu du Polymorphisme

book
Méthode Virtuelle Pure

Le concept de méthodes virtuelles est essentiel pour atteindre le polymorphisme, permettant une conception logicielle flexible et extensible. Les méthodes virtuelles pures vont plus loin en définissant des interfaces et en prenant en charge la liaison dynamique.

Syntaxe d'une méthode virtuelle pure

Une méthode virtuelle pure est déclarée avec le mot-clé virtual et initialisée à zéro. Cela indique que la fonction n'a pas de définition dans la class et doit être redéfinie par toute sous-classe avant que des objets de cette class puissent être instanciés.

virtual.h

virtual.h

copy
1
virtual void example() = 0;

Cette méthode fonctionne de manière similaire à une méthode standard, à l'exception qu'elle ne possède pas de corps délimité par { } et se termine par = 0;, indiquant ainsi l'absence d'implémentation. Cependant, les autres règles pour cette méthode sont identiques à celles des méthodes ordinaires.

Déclarer une méthode virtuelle pure rend la class dans laquelle elle est déclarée abstraite, ce qui signifie qu'il devient impossible d'instancier des objets de cette classe. Cette restriction existe car chaque méthode de la class doit être implémentée avant de créer et d'utiliser une instance, afin de prévenir les erreurs et les comportements imprévisibles. Examinez le code ci-dessous :

Animal.h

Animal.h

copy
1234
class Animal { public: virtual void speak() = 0; };

La Animal class comporte une méthode virtuelle pure nommée speak(), empêchant l'instanciation d'objets à partir de cette classe. Cette conception est logique, car l'objectif de la méthode virtuelle est de représenter les sons distinctifs produits par chaque animal.

En rendant la méthode virtuelle, chaque sous-classe peut fournir sa propre implémentation, reflétant l'individualité du son de chaque animal. La déclaration en tant que virtuelle pure indique qu'aucune implémentation par défaut n'existe, soulignant la nécessité d'implémentations concrètes dans les classes dérivées.

main.cpp

main.cpp

copy
1234567
#include "Animal.h" int main() { // cannot declare variable 'animal' to be of abstract type Animal animal; }

Cela est également cohérent. Créer des instances de la Animal class serait impraticable et contre-intuitif, car elle représente un concept abstrait servant de catégorie pour différents animaux. Aucun comportement spécifique n'est associé à un animal générique, ce qui renforce le caractère abstrait de la class et met en avant l'importance de créer des sous-classes spécialisées pour représenter les sons uniques de chaque animal spécifique.

main.cpp

main.cpp

copy
12345678910111213141516171819202122232425262728293031
#include <iostream> class Animal { public: // Pure virtual function to enforce implementation in derived classes virtual void speak() = 0; }; class Cat : public Animal { public: void speak() override { std::cout << "Meow!" << std::endl; } }; class Dog : public Animal { public: void speak() override { std::cout << "Bark!" << std::endl; } }; class Cow : public Animal { public: void speak() override { std::cout << "Moo!" << std::endl; } }; void pet(Animal& animal) { animal.speak(); } int main() { // Replace `Cat` with `Dog` or `Cow` to see their specific behavior Cat cat; pet(cat); }

Bien qu'il ne soit pas possible de créer un objet de type Animal directement, il est tout de même possible de l'utiliser comme paramètre dans une fonction. À l'instar de l'exemple précédent avec le bouton, cette approche exploite le polymorphisme pour concevoir un programme polyvalent capable de modifier dynamiquement son comportement à l'exécution.

Note
Remarque

Essayez de passer un objet d'une autre class à la fonction et observez le résultat. Essayez également de créer un objet de la class abstraite afin de constater comment le compilateur empêche l'instanciation en raison de méthodes virtuelles pures non implémentées.

question mark

Que se passe-t-il lorsqu'une classe contient une méthode virtuelle pure ?

Select the correct answer

Tout était clair ?

Comment pouvons-nous l'améliorer ?

Merci pour vos commentaires !

Section 5. Chapitre 3
some-alt