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 ?

173voto

La raison =0 est utilisé est que Bjarne Stroustrup ne pensait pas pouvoir faire passer un autre mot-clé, tel que "pure", auprès de la communauté C++ au moment où la fonctionnalité a été mise en œuvre. Cette situation est décrite dans son livre, La conception et l'évolution du C++ , section 13.2.3 :

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

Il indique également de manière explicite qu'il n'est pas nécessaire d'attribuer la valeur NULL à l'entrée de la table virtuelle, et que ce n'est pas la meilleure manière d'implémenter des fonctions virtuelles pures.

77voto

Jerry Coffin Points 237758

Comme pour la plupart des questions "Pourquoi" concernant la conception du C++, la première chose à faire est de se demander La conception et l'évolution du C++ par Bjarne Stroustrup 1 :

Les curieux =0 s plutôt que l'alternative évidente de la syntaxe d'introduire un nouveau mot-clé pure o abstract b n accepté. Si j'avais suggéré pure , La version 2.0 aurait été livrée sans classes abstraites. S'il fallait choisir entre une syntaxe plus agréable et des classes abstraites [ ] Plutôt que de risquer un retard et [ ] pure J'ai utilisé la tradition C d'utiliser 0 pour représenter "pas là". Le =0 s m initialisateur d'une fonction également avec la vision (simpliste, mais généralement adéquate) de l'ensemble des fonctions virtuelles comme un vecteur de pointeurs de pointeurs de fonctions. [ ... ]

1 §13.2.3 Syntaxe

29voto

Kristopher Johnson Points 34554

La section 9.2 de la norme C++ donne la syntaxe des membres de classe. Elle inclut cette production :

pure-specifier:
    = 0

La valeur n'a rien de particulier. "= 0" est juste la syntaxe pour dire "cette fonction est purement virtuelle". Cela n'a rien à voir avec l'initialisation, les pointeurs nuls ou la valeur numérique zéro, bien que la similitude avec ces choses puisse avoir une valeur mnémotechnique.

19voto

cquillen Points 486

Je ne sais pas s'il y a une signification à cela. Il s'agit simplement de la syntaxe du langage.

17voto

sbi Points 100828

Le C++ a toujours hésité à introduire de nouveaux mots-clés, car les nouveaux mots réservés perturbent les anciens programmes qui utilisent ces mots comme identificateurs. Le fait que le langage respecte autant que possible le code ancien est souvent considéré comme l'une de ses forces.

Les = 0 La syntaxe pourrait en effet avoir été choisie car elle ressemble à la définition d'une entrée vtable à 0 (La plupart des compilateurs assignent de telles entrées de table virtuelle à un stub qui émet une erreur avant d'interrompre le programme). La syntaxe a été choisie principalement parce qu'elle n'était pas utilisée auparavant et qu'elle permettait d'éviter l'introduction d'un nouveau mot-clé.

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