Nous déclarons toujours une fonction virtuelle pure comme:
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 pour cette fonction à NULL et que toute autre valeur ici entraîne une erreur de compilation. Cette compréhension est-elle correcte ou non?
c++
abstract-class
pure-virtual
mukeshkumar
la source
la source
virtual void func() = 100;
Réponses:
La raison en
=0
est que Bjarne Stroustrup ne pensait pas pouvoir obtenir un autre mot-clé, tel que "pur", au-delà de la communauté C ++ au moment où la fonctionnalité était implémentée. Ceci est décrit dans son livre, The Design & Evolution of C ++ , section 13.2.3:Il déclare également explicitement que cela n'a pas besoin de définir l'entrée vtable sur NULL, et que cela n'est pas la meilleure façon d'implémenter des fonctions virtuelles pures.
la source
Comme pour la plupart des questions «Pourquoi» sur la conception de C ++, le premier endroit à regarder est La conception et l'évolution du C ++ , par Bjarne Stroustrup 1 :
1 §13.2.3 Syntaxe
la source
La section 9.2 du standard C ++ donne la syntaxe des membres de classe. Il comprend cette production:
Il n'y a rien de spécial dans la valeur. "= 0" est juste la syntaxe pour dire "cette fonction est purement virtuelle". Cela n'a rien à voir avec l'initialisation ou les pointeurs nuls ou la valeur numérique zéro, bien que la similitude avec ces choses puisse avoir une valeur mnémonique.
la source
= 0
Que voulez-vous savoir d'autre? Ce serait la même chose que de demander pourquoi le corps de la fonction est enveloppé avec {} La réponse serait, parce que c'est ce que définit la syntaxe C ++.Je ne sais pas s'il y a un sens derrière cela. C'est juste la syntaxe du langage.
la source
C ++ a toujours évité 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. Il est souvent considéré comme l'une des forces du langage de respecter le plus possible l'ancien code.
La
= 0
syntaxe peut en effet avoir été choisie car elle ressemble à la définition d'une entrée de vtable0
, mais c'est purement symbolique. (La plupart des compilateurs attribuent de telles entrées de 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 avant et cela a sauvé l'introduction d'un nouveau mot-clé.la source
pure
mot-clé aurait été génial dans mon livre. Quoi qu'il en soit, il est bon de comprendre la justification.#define pure = 0
.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 la
= 0
syntaxe. Ils auraient pu facilement faire de même en ajoutant un mot clé pur. Mais C ++ répugne assez à ajouter de nouveaux mots clés et préfère utiliser d'autres mécanismes pour introduire des fonctionnalités.la source
Rien n'est «initialisé» ou «attribué» zéro dans ce cas.
= 0
dans juste une construction syntaxique composée de=
et de0
jetons, qui n'a absolument aucun rapport avec l'initialisation ou l'affectation.Il n'a aucun rapport avec une valeur réelle dans "vtable". Le langage C ++ n'a aucune notion de "vtable" ou quoi que ce soit de ce genre. Diverses «vtables» ne sont rien de plus que des détails d'implémentations spécifiques.
la source
Je me souviens avoir lu que la justification de la syntaxe amusante était que c'é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 ++ par Bjarne Stroustrup.
la source
Je suppose que ce n'est qu'une partie de la grammaire C ++. Je ne pense pas qu'il y ait de restrictions sur la façon dont les compilateurs implémentent réellement cela pour un format binaire spécifique donné. Vous supposez probablement que c'était juste pour les premiers compilateurs C ++.
la source
Le
= 0
déclare une fonction virtuelle pure .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 remise à zéro lors de la construction (bien que la plupart des compilateurs gèrent les vtables de la même manière).
la source
= 0
faire est de rendre la classe entière abstraite et d'interdire les appels virtuels à des fonctions pures. Les appels non virtuels sont toujours parfaitement OK, c'est-à-dire lorsque la définition (si vous en avez fourni une) est utilisée.__cxa_pure_virtual
arobenko.gitbooks.io/bare_metal_cpp/content/compiler_output/... au lieu de Base :: f ()Eh bien, vous pouvez également initialiser l'entrée vtable pour pointer vers une fonction réelle "
Il semble intuitif que l'entrée vtable puisse être définie pour ne pointer nulle part (0) ou vers une fonction. Le fait de vous laisser spécifier votre propre valeur pour cela entraînerait probablement un pointage 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 sur la raison pour laquelle "= 0" est utilisé
la source