web-dev-qa-db-fra.com

Que signifie définir la déclaration d'une fonction égale à 0? Comment attribuer un entier à une fonction?

Je parcourais les sources d'un (je préfère ne pas nommer) GUI Toolkit qui a encapsulé l'API Windows lorsque j'ai trouvé la définition de fonction suivante dans la classe de fenêtre:

 virtual LRESULT CALLBACK wndProc (HWND, UINT, WPARAM, LPARAM) = 0;

Que se passe-t-il ici? Comment attribuer une fonction à un entier? Ou l'affecte-t-il à NULL? Avez-vous besoin de le faire si vous souhaitez utiliser des pointeurs de fonction dans wndproc?

50
ApprenticeHacker

Cette ligne de code définit une fonction virtuelle pure en C++. Cela n'a rien à voir avec l'API Win32 ou le code GUI autrement délicat en général.

Une fonction virtuelle pure est une fonction virtuelle qui est utilisée lorsque le concepteur de la classe veut forcer les classes dérivées à remplacer la fonction et à fournir leur propre implémentation.

Si une classe contient des fonctions virtuelles pures, elle est considérée comme une classe "abstraite" et les instances de cette classe ne peuvent pas être instanciées.

C++ utilise la syntaxe spéciale = 0; pour indiquer des fonctions virtuelles pures au lieu d'ajouter un nouveau mot-clé au langage (comme le font des langages comme C #). Vous pouvez le considérer comme définissant le pointeur de fonction sur 0.

Voir également les réponses à cette question connexe: Quelles sont les utilisations des fonctions virtuelles pures en C++?


(Soit dit en passant, les fichiers d'en-tête Windows <windows.h> définissez simplement NULL comme 0. Donc, techniquement, le programmeur pourrait ont écrit = NULL, mais il est beaucoup plus clair d'utiliser la constante numérique 0 et de réserver NULL pour les valeurs du pointeur.)

64
Cody Gray

C'est un fonction virtuelle pure.

Le =0 n'est que la syntaxe utilisée pour indiquer qu'il s'agit d'une fonction virtuelle pure.

La présence d'une fonction virtuelle pure dans une classe fait de la classe un classe abstraite. On ne peut créer un objet d'aucune classe abstraite. Cependant, un pointeur ou une référence à une telle classe abstraite peut être créé. Votre classe dérivée doit remplacer cette méthode.

Quel est le but de rendre une fonction pure virtuelle?

Habituellement, une fonction est rendue pure virtuelle afin que le concepteur de la classe Abstract Base puisse appliquer la classe dérivée pour remplacer cette fonction et fournir sa propre implémentation. Il est important de noter cependant qu'une fonction virtuelle pure peut avoir sa propre implémentation, de sorte que la classe dérivée peut appeler la version de classe de base de la fonction.

Parfois, une fonction virtuelle pure est ajoutée juste pour rendre la classe de base abstraite (donc ses instances ne peuvent pas être créées). Habituellement, dans une telle situation, au lieu d'ajouter une fonction factice pour rendre une classe abstraite, le destructeur de la classe est rendu purement virtuel.

9
Alok Save

Il s'agit d'une fonction " pure virtual " que vous devez remplacer dans une classe dérivée.

5
Uwe Keim