145 votes

Pourquoi une fonction virtuelle pure est-elle initialisée par 0 ?

Nous déclarons toujours une fonction virtuelle pure comme suit :

virtual void fun () = 0 ;

C'est-à-dire qu'elle est toujours affectée à 0.

Ce que je comprends, c'est qu'il s'agit d'initialiser l'entrée de la table virtuelle pour cette fonction à NULL et que toute autre valeur ici entraîne une erreur au moment de la compilation. Est-ce que cette compréhension est correcte ou non ?

11voto

JaredPar Points 333733

Le C++ doit avoir un moyen de distinguer une fonction virtuelle pure d'une déclaration d'une fonction virtuelle normale. Ils ont choisi d'utiliser l'élément = 0 syntaxe. Ils auraient pu faire la même chose en ajoutant un mot-clé pur. Mais le C++ répugne à ajouter de nouveaux mots-clés et préfère utiliser d'autres mécanismes pour introduire des fonctionnalités.

7voto

AndreyT Points 139512

Rien n'est "initialisé" ou "assigné" à zéro dans ce cas. = 0 n'est qu'une construction syntaxique composée de = et 0 ce qui n'a absolument aucun rapport avec l'initialisation ou l'affectation.

Elle n'a aucun rapport avec une valeur réelle de la "vtable". Le langage C++ n'a aucune notion de "vtable" ou de quoi que ce soit d'autre. Les différentes "vtables" ne sont rien d'autre que des détails d'implémentations spécifiques.

3voto

luke Points 16255

Je me souviens avoir lu que la justification de la syntaxe amusante était qu'elle était plus facile (en termes d'acceptation des normes) que l'introduction d'un autre mot-clé qui ferait la même chose.

Je crois que cela a été mentionné dans The Design and Evolution of C++ de Bjarne Stroustrup.

2voto

rui Points 4282

Je suppose que cela fait partie de la grammaire du C++. Je ne pense pas qu'il y ait de restrictions sur la manière dont les compilateurs implémentent cela pour un format binaire spécifique donné. Votre hypothèse était probablement la bonne pour les premiers compilateurs C++.

2voto

Alexander Gessler Points 26717

Les = 0 déclare un fonction virtuelle pure .

Ce que l'on comprend, c'est qu'il s'agit d'initialiser l'entrée de la table virtuelle pour cette fonction à NULL et que toute autre valeur ici entraîne une erreur au moment de la compilation.

Je ne pense pas que ce soit le cas. Il s'agit simplement d'une syntaxe spéciale. La table v est définie par l'implémentation. Personne ne dit qu'une entrée de table virtuelle pour un membre pur doit être mise à zéro lors de la construction (bien que la plupart des compilateurs traitent les tables virtuelles de la même manière).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X