Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Apprendre Mots-Clés Virtual et Override | 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
Mots-Clés Virtual et Override

Mot-clé Virtual

Le mot-clé virtual est utilisé avant la déclaration d'une méthode dans une class pour résoudre le problème évoqué précédemment. Il est employé pour les méthodes communes à toutes les sous-classes mais nécessitant des implémentations distinctes pour chacune. Essentiellement, il ressemble à toute autre déclaration de méthode, à l'exception du fait qu'il commence par virtual.

Base.h

Base.h

copy
1234567
class Base { public: virtual void display() { std::cout << "Base class display() called" << std::endl; } };

Lorsqu'une fonction est déclarée comme virtual dans une superclasse, cela permet qu'elle soit redéfinie dans une sous-classe. Cela signifie que la sous-classe peut fournir sa propre implémentation, qui sera invoquée à la place de l'implémentation originale lorsque la fonction est appelée via un pointeur ou une référence vers la superclasse.

main.cpp

main.cpp

copy
123456789101112131415161718192021222324252627
#include <iostream> class Base { public: virtual void display() { std::cout << "Base display() called" << std::endl; } }; class Derived : public Base { public: void display() { std::cout << "Derived display() called" << std::endl; } }; int main() { Base* obj; Derived derived; obj = &derived; obj->display(); }
Note
Remarque

Lorsque vous disposez d’un pointeur vers un objet et que vous souhaitez accéder à ses membres via ce pointeur, utilisez l’opérateur flèche (->).

En revenant à la solution du problème initial avec les boutons, cette méthode permet de créer facilement une fonction unique qui prend en paramètre un pointeur vers le parent Button. Par conséquent, il est possible d’appeler cette fonction en passant un SubmitButton, un ResetButton ou un CancelButton, et elle se comportera comme prévu.

main.cpp

main.cpp

copy
12345678910111213141516171819202122232425262728293031
#include <iostream> class Button { public: virtual void onClick() { std::cout << "Click" << std::endl; } }; class UploadButton : public Button { public: void onClick() { std::cout << "Upload" << std::endl; } }; class ResetdButton : public Button { public: void onClick() { std::cout << "Reset" << std::endl; } }; class CancelButton : public Button { public: void onClick() { std::cout << "Cancel" << std::endl; } }; void user_clicked_button(Button& btn) { btn.onClick(); } int main() { UploadButton uploadButton; user_clicked_button(uploadButton); }
Note
Remarque

Essayer de créer des objets de différentes sous-classes et de les passer à la fonction.

Le mot-clé Override

Le mot-clé override est utilisé dans une sous-classe pour indiquer explicitement qu'une fonction membre redéfinit une fonction virtuelle provenant d'une superclasse. Il permet de détecter des erreurs à la compilation si la signature de la fonction dans la sous-classe ne correspond à aucune fonction virtuelle dans la superclasse.

main.cpp

main.cpp

copy
1234567891011121314
#include <iostream> class Button { public: virtual void handleClick() { std::cout << "Click" << std::endl; } }; class UploadButton : public Button { public: // marked override, but does not override void onClick() override { std::cout << "Upload" << std::endl; } }; int main() { }

En cas d’erreur, telle qu’une faute de frappe dans la signature de la fonction ou si la superclasse ne possède pas la fonction que vous tentez de redéfinir, le compilateur générera une erreur, ce qui permet de détecter d’éventuels bogues lors de la compilation. Cette fonctionnalité est particulièrement utile dans les environnements de travail en équipe, où le suivi des modifications comme le renommage de méthodes peut s’avérer complexe.

question mark

Quel est le principal objectif du mot-clé virtual ?

Select the correct answer

Tout était clair ?

Comment pouvons-nous l'améliorer ?

Merci pour vos commentaires !

Section 5. Chapitre 2

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
Mots-Clés Virtual et Override

Mot-clé Virtual

Le mot-clé virtual est utilisé avant la déclaration d'une méthode dans une class pour résoudre le problème évoqué précédemment. Il est employé pour les méthodes communes à toutes les sous-classes mais nécessitant des implémentations distinctes pour chacune. Essentiellement, il ressemble à toute autre déclaration de méthode, à l'exception du fait qu'il commence par virtual.

Base.h

Base.h

copy
1234567
class Base { public: virtual void display() { std::cout << "Base class display() called" << std::endl; } };

Lorsqu'une fonction est déclarée comme virtual dans une superclasse, cela permet qu'elle soit redéfinie dans une sous-classe. Cela signifie que la sous-classe peut fournir sa propre implémentation, qui sera invoquée à la place de l'implémentation originale lorsque la fonction est appelée via un pointeur ou une référence vers la superclasse.

main.cpp

main.cpp

copy
123456789101112131415161718192021222324252627
#include <iostream> class Base { public: virtual void display() { std::cout << "Base display() called" << std::endl; } }; class Derived : public Base { public: void display() { std::cout << "Derived display() called" << std::endl; } }; int main() { Base* obj; Derived derived; obj = &derived; obj->display(); }
Note
Remarque

Lorsque vous disposez d’un pointeur vers un objet et que vous souhaitez accéder à ses membres via ce pointeur, utilisez l’opérateur flèche (->).

En revenant à la solution du problème initial avec les boutons, cette méthode permet de créer facilement une fonction unique qui prend en paramètre un pointeur vers le parent Button. Par conséquent, il est possible d’appeler cette fonction en passant un SubmitButton, un ResetButton ou un CancelButton, et elle se comportera comme prévu.

main.cpp

main.cpp

copy
12345678910111213141516171819202122232425262728293031
#include <iostream> class Button { public: virtual void onClick() { std::cout << "Click" << std::endl; } }; class UploadButton : public Button { public: void onClick() { std::cout << "Upload" << std::endl; } }; class ResetdButton : public Button { public: void onClick() { std::cout << "Reset" << std::endl; } }; class CancelButton : public Button { public: void onClick() { std::cout << "Cancel" << std::endl; } }; void user_clicked_button(Button& btn) { btn.onClick(); } int main() { UploadButton uploadButton; user_clicked_button(uploadButton); }
Note
Remarque

Essayer de créer des objets de différentes sous-classes et de les passer à la fonction.

Le mot-clé Override

Le mot-clé override est utilisé dans une sous-classe pour indiquer explicitement qu'une fonction membre redéfinit une fonction virtuelle provenant d'une superclasse. Il permet de détecter des erreurs à la compilation si la signature de la fonction dans la sous-classe ne correspond à aucune fonction virtuelle dans la superclasse.

main.cpp

main.cpp

copy
1234567891011121314
#include <iostream> class Button { public: virtual void handleClick() { std::cout << "Click" << std::endl; } }; class UploadButton : public Button { public: // marked override, but does not override void onClick() override { std::cout << "Upload" << std::endl; } }; int main() { }

En cas d’erreur, telle qu’une faute de frappe dans la signature de la fonction ou si la superclasse ne possède pas la fonction que vous tentez de redéfinir, le compilateur générera une erreur, ce qui permet de détecter d’éventuels bogues lors de la compilation. Cette fonctionnalité est particulièrement utile dans les environnements de travail en équipe, où le suivi des modifications comme le renommage de méthodes peut s’avérer complexe.

question mark

Quel est le principal objectif du mot-clé virtual ?

Select the correct answer

Tout était clair ?

Comment pouvons-nous l'améliorer ?

Merci pour vos commentaires !

Section 5. Chapitre 2
some-alt