Pourquoi est une fonction virtuelle pure initialisée à 0?
Nous avons toujours déclarer une fonction virtuelle pure comme:
virtual void fun () = 0 ;
I. e., elle est toujours attribuée à 0.
Ce que je comprends, c'est que c'est pour initialiser la vtable entrée pour que cette fonction NULLE et toute autre valeur ici les résultats dans une erreur de compilation. Est-ce une compréhension correcte ou pas?
- Notez que vtable n'est pas une exigence de la langue, mais juste une option de mise en œuvre de méthodes virtuelles. Un compilateur pourrait créer le même abstraction avec des différents la mise en œuvre (qui est, sans vtable, et sans aucun élément de y 0)
- Re votre question supplémentaire - c'est ce que ma réponse (et plusieurs autres) dit.
- Juste curieux de savoir ce qui se passe si je donne,
virtual void func() = 100;
Vous devez vous connecter pour publier un commentaire.
La raison
=0
est utilisé, c'est que Bjarne Stroustrup ne pensais pas qu'il pourrait obtenir un autre mot-clé, comme "pur" dans le passé, le C++ de la communauté au moment de la fonctionnalité a été mise en œuvre. Ceci est décrit dans son livre, Le Design & Évolution de C++, section 13.2.3:Il dit aussi explicitement que cela ne doit pas définir la vtable entrée à NULL, et que, si tel n'est pas le meilleur moyen de mettre en œuvre des fonctions virtuelles pures.
Comme la plupart des "Pourquoi" des questions sur la conception de C++, le premier endroit à regarder est La Conception et l'Évolution de C++, par Bjarne Stroustrup1:
1§13.2.3 Syntaxe
De l'article 9.2 de la norme C++ donne la syntaxe pour les membres de la classe. Il inclut cette production:
Il n'y a rien de spécial à propos de la valeur. "= 0" est juste la syntaxe pour dire "cette fonction est virtuelle pure." Il n'a rien à voir avec de l'initialisation ou de pointeurs null ou la valeur numérique zéro, bien que la similitude de ces choses peuvent avoir mnémonique valeur.
= 0
Quoi d'autre voulez-vous savoir? Ce serait la même chose que de se demander pourquoi la fonction de corps est enveloppé avec {} La réponse serait, parce que c'est ce que le C++ définit la syntaxe.Je ne sais pas si il y a un sens derrière tout cela. C'est juste la syntaxe de la langue.
C++ a toujours répugné à l'introduction de nouveaux mots-clés, car de nouveaux mots réservés casser les vieux programmes qui utilisent ces termes pour les identificateurs. C'est souvent considérée comme l'une des langues les forces qu'il respecte ancien code autant que possible.
La
= 0
syntaxe pourrait en effet avoir été choisi car il ressemble à la définition d'une vtable entrée à0
, mais c'est purement symbolique. (La plupart des compilateurs céder la vtable des entrées à un stub qui émet une erreur avant l'abandon du programme.) La syntaxe est principalement choisi parce qu'il n'était pas utilisé pour quoi que ce soit avant et il a sauvé l'introduction d'un nouveau mot-clé.pure
mot-clé aurait été génial dans mon livre. De toute façon, il est bon de comprendre le raisonnement.#define pure = 0
.:-)
C++ doit avoir un moyen de distinguer une fonction virtuelle pure à partir d'une déclaration à la normale de la fonction virtuelle. Ils ont choisi d'utiliser le
= 0
de la syntaxe. Ils pourraient difficilement faire la même chose en ajoutant un pur mot-clé. Mais le C++ est assez réticents à ajouter de nouveaux mots clés et préfère utiliser d'autres moyens d'introduire des fonctionnalités.Rien n'est "initilaized" ou "attribué" zéro dans ce cas.
= 0
en seulement syntaxiques de construction composé de=
et0
des jetons, ce qui n'a absolument aucun rapport avec l'initialisation ou de la cession.Il n'a aucun rapport avec une quelconque valeur réelle dans "vtable". Le langage C++ n'a pas de notion de "vtable" ou anythng comme ça. Divers "vtables" ne sont rien de plus que des détails d'implémentations spécifiques.
Je me souviens avoir lu que la justification de la drôle de syntaxe a été qu'il était plus facile (en termes de normes d'acceptation) que l'introduction d'un autre mot-clé qui permettrait de faire la même chose.
Je crois que cela a été mentionné dans La Conception et l'Évolution de C++ de Bjarne Stroustrup.
Je suppose que c'est juste une partie du C++ et de grammaire. Je ne pense pas qu'il existe des restrictions à la façon dont les compilateurs de mettre en œuvre ce pour un format binaire spécifique. Vous êtes hypothèse était probablement bon pour les compilateurs C++.
La
= 0
déclare un fonction virtuelle pure.Je ne pense pas que c'est vrai. C'est juste une syntaxe spéciale. La vtable de la mise en œuvre est définie. Personne ne dit un vtable entrée pour un pur membre doit être effectivement remis à zéro lors de la construction (bien que la plupart des compilateurs poignée vtables similaire).
= 0
n'est fait à l'ensemble de la classe abstraite et interdit virtual appels à des fonctions pures. Non les appels virtuels sont toujours perfcectly OK, c'est lors de la définition (si vous avez fourni un) est utilisé.Bien, vous pouvez également initialiser la vtable entrée au point d'une fonction réelle"
Semble intuitif que la vtable entrée peut être définie pour le point de nulle part (0) ou à une fonction. Vous permettant de spécifier la valeur de votre choix pour qu'il en résultera probablement en vers à la poubelle au lieu d'une fonction. Mais c'est pourquoi "= 0" est autorisé et "= 1" ne l'est pas. Je soupçonne Neil Butterworth est juste à propos de pourquoi "= 0" est utilisé à toutes les