web-dev-qa-db-fra.com

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

Nous déclarons toujours une fonction virtuelle pure en tant que:

virtual void fun () = 0 ;

C'est-à-dire qu'il est toujours attribué à 0.

Ce que je comprends, c’est qu’il s’agit d’initialiser l’entrée vtable de cette fonction sur NULL et que toute autre valeur entraîne une erreur lors de la compilation. Cette compréhension est-elle correcte ou non?

145
mukeshkumar

La raison =0 _ est utilisé, c'est que Bjarne Stroustrup ne pensait pas pouvoir obtenir un autre mot clé, tel que "pur", passé de la communauté C++ au moment de la mise en œuvre de la fonctionnalité. Ceci est décrit dans son livre, Conception et évolution de C++ , section 13.2.3:

La syntaxe curieuse = 0 a été choisie ... car à l'époque je ne voyais aucune chance de faire accepter un nouveau mot clé.

Il déclare également explicitement qu'il n'est pas nécessaire de définir l'entrée vtable sur NULL et que cela n'est pas la meilleure façon de mettre en œuvre des fonctions virtuelles pures.

159
anon

Comme pour la plupart des questions "Pourquoi" sur la conception du C++, le premier endroit à regarder est Conception et évolution du C++, par Bjarne Stroustrup1:

Le curieux =0 La syntaxe a été choisie par rapport à la solution évidente consistant à introduire un nouveau mot clé pure ou abstract car à ce moment-là, je ne voyais aucune chance de faire accepter un nouveau mot clé. Si j'avais suggéré pure, la version 2.0 aurait été livrée sans classes abstraites. Étant donné le choix entre une syntaxe plus agréable et des classes abstraites, j'ai choisi des classes abstraites. Plutôt que de risquer des retards et d’engendrer certains combats pour pure, j’ai utilisé les conventions traditionnelles C et C++ d’utiliser 0 pour représenter "pas là". Le =0 La syntaxe correspond à mon point de vue selon lequel un corps de fonction est l’initialisateur d’une fonction, ainsi que de la vue (simpliste, mais généralement adéquate) de l’ensemble des fonctions virtuelles implémentées en tant que vecteur de pointeurs de fonctions. [...]

1§13.2.3 Syntaxe

76
Jerry Coffin

La section 9.2 de la norme C++ donne la syntaxe pour les membres de classe. Il comprend cette production:

pure-specifier:
    = 0

Il n'y a rien de spécial à propos de la valeur. "= 0" est juste la syntaxe pour dire "cette fonction est virtuelle pure". Cela n'a rien à voir avec l'initialisation, les pointeurs nuls ou la valeur numérique zéro, bien que la similitude avec ces éléments puisse avoir une valeur mnémonique.

29
Kristopher Johnson

Je ne suis pas sûr s'il y a un sens derrière cela. C'est juste la syntaxe du langage.

19
cquillen

C++ s'est toujours efforcé d'introduire de nouveaux mots-clés, car les nouveaux mots réservés cassent les anciens programmes qui utilisent ces mots pour les identificateurs. On considère souvent que l'une des forces de la langue est de respecter autant que possible l'ancien code.

Le = 0 La syntaxe pourrait bien avoir été choisie car elle ressemble à définir une entrée de vtable sur 0, mais c'est purement symbolique. (La plupart des compilateurs assignent de telles entrées vtable à un stub qui émet une erreur avant d'abandonner le programme.) La syntaxe a été principalement choisie car elle n'était utilisée pour rien auparavant et elle permettait de sauvegarder l'introduction d'un nouveau mot-clé.

15
sbi

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

11
JaredPar

Rien n'est "initialisé" ou "attribué" à zéro dans ce cas. = 0 dans une construction syntaxique composée de = et 0 jetons, qui n’ont absolument aucune relation avec l’initialisation ou l’affectation.

Il n'a aucune relation avec aucune valeur réelle dans "vtable". Le langage C++ n’a aucune notion de "vtable" ni quoi que ce soit du genre. Divers "vtables" ne sont rien d'autre que des détails sur des implémentations spécifiques.

7
AnT

Je me souviens avoir lu que la syntaxe amusante se justifiait par le fait qu'il était plus facile (en termes d'acceptation des normes) que d'introduire 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.

3
luke

Je suppose que cela fait simplement partie de la grammaire C++. Je ne pense pas qu'il y ait de restrictions à la manière dont les compilateurs implémentent cela pour un format binaire donné. Vous supposez probablement que c'était bien pour les premiers compilateurs C++.

2
rui

Le = 0declares a fonction virtuelle pure.

Ce qu’il faut comprendre, c’est qu’il s’agit d’initialiser l’entrée vtable de cette fonction sur NULL et que toute autre valeur entraîne ici une erreur de compilation.

Je ne pense pas que ce soit vrai. C'est juste une syntaxe spéciale. La vtable est définie par l'implémentation. Personne ne dit qu'une entrée vtable pour un membre pur doit être mise à zéro lors de la construction (bien que la plupart des compilateurs traitent vtables de la même manière).

2
Alexander Gessler

Eh bien, vous pouvez également initialiser l’entrée vtable pour pointer vers une fonction réelle "

 virtual void fun()
 {
     //dostuff()
 }

Semble intuitif que l’entrée vtable peut être définie pour ne pointer nulle part (0) ou vers une fonction. Vous permettre de spécifier votre propre valeur car cela aurait probablement pour conséquence de pointer vers des déchets plutôt que vers une fonction. Mais c'est pourquoi "= 0" est autorisé et "= 1" ne l'est pas. Je soupçonne que Neil Butterworth a raison de savoir pourquoi "= 0" est utilisé

1
Brian