7
votes

Devrais-je toujours utiliser le mot clé contextuel de remplacement?

Je sais que le mot-clé contextuel a été introduit pour écrire un code Safer (en vérifiant pour une fonction virtuelle avec la même signature) mais je ne me sens pas bien C'est parce qu'il semble être redondant pour que je puisse écrire remplacer chaque fois que je veux remplacer une fonction

Est-ce une mauvaise pratique de ne pas utiliser Remplacer le mot-clé contextuel pour 99% des cas? Pourquoi / quand devrais-je devoir l'utiliser ( un avertissement de compilateur n'est pas suffisant lorsque nous masquons une fonction virtuelle à tort )?

Edit: En d'autres termes; Quel est l'avantage d'utiliser le mot-clé contextuel en C ++ 11 pendant que nous avions toujours un avertissement de compilateur si nous cachantons une fonction virtuelle à tort en C ++ 03 (sans utiliser de remplacement < / Code> Mot-clé contextuel)?


1 commentaires

Pouvez-vous expliquer pourquoi vous pensez qu'il est redondant?


3 Réponses :


3
votes

Annotations est ce que vous appelez les mots-clés contextuels, ils servent de clarification, afin de s'assurer que quiconque lit le code réalise est une fonction qui remplace une fonction dans une superclasse ou une interface. Le compilateur peut également donner un avertissement si la fonction à l'origine remplacée a été supprimée, auquel cas vous voudrez peut-être penser à supprimer votre fonction.

Autant que je sache, rien de mal n'arrive pas si vous envisagez des anotations. Ce n'est ni juste ni faux. Comme vous avez déjà indiqué déjà: les annotations sont introduites pour écrire un code plus sûr . Toutefois: ils ne changeront pas votre code de manière fonctionnelle .

Si vous travaillez comme un seul programmeur de votre propre projet, cela pourrait ne pas contenir que vous les utilisez ou non. Il est toutefois une bonne pratique à coller à un style (c'est-à-dire que vous l'utilisez, soit vous ne l'utilisez pas. N'importe quoi d'entre eux comme parfois l'utiliser et parfois non seulement la confusion)

Si vous travaillez dans une équipe, vous devez discuter du sujet avec vos coéquipiers et décider que vous utilisez tous ou non.


3 commentaires

Je dois signaler que j'ai découvert la balise C ++ (et la modification de C ++) après avoir posté ma réponse. J'ai d'abord pensé que c'était tout à propos de Java. Cependant, la façon dont je le vois, le concept d'annotations est la même pour les deux langues. Donc, cela ne devrait pas avoir d'importance. Mais peut-être que quelqu'un veut confirmer ma réponse ou modifier s'il est jugé nécessaire.


"Le compilateur peut également donner un avertissement si la fonctionnalité à l'origine réparée a été supprimée", mais en C ++, une erreur de compilateur. BTW Vous avez raison, en utilisant Remplacement du mot clé augmentera la lisibilité du code, mais je suis merveille pourquoi C ++ Community ajouta un mot-clé uniquement pour la lisibilité !? :-P


Nous avons inventé C C ​​++, etc. Parce que la lecture / écriture de la machine (zéros et celles-ci) ou code d'assemblage est un tracas. Les langages de programmation sont inventés dans un seul but: faciliter la programmation (et plus lisible). Et chaque langage de programmation a un concept différent de ce qui est nécessaire pour que cela se produise. =) Btw 10% du temps Un scientifique informatique crée un nouveau code, 20% du temps qu'il modifie le code existant et enfin 70% de son temps qu'il tente de comprendre ce que le code déjà existant fait réellement. Donc, oui la lisibilité fait une différence dans 90% des cas.



1
votes

Quel est l'avantage d'utiliser le mot-clé contextuel de remplacement en C ++ 11 pendant que nous avions toujours un avertissement de compilateur si nous cachat une fonction virtuelle à tort

presque aucun!?

mais: Cela dépend de la manière dont vos avertissements seront acceptés par vos règles de construction. Si vous dites, chaque avertissement doit être corrigé, vous obtiendrez le même résultat jusqu'à ce que vous utilisiez un compilateur qui vous donne l'avertissement.

Nous avons décidé de toujours utiliser le remplacement et supprimer virtuel sur des méthodes de dépassement. Donc, la "surcharge" est zéro et le code est portable au sens de "donner une erreur" sur une mauvaise utilisation.

Je ressemble personnellement à cette nouvelle fonctionnalité, car cela rend la langue plus claire. Si vous dites que c'est un remplacement, ce sera vérifié! et si nous voulons ajouter une nouvelle méthode avec une signature différente, nous n'obtiendrons pas un faux avertissement positif , qui est important dans votre scénario!


0 commentaires

9
votes

Le mot clé est totalement utile et je vous recommanderais de l'utiliser tout le temps .

Si vous MISSPELL < / EM> Votre fonction virtuelle Il va compiler une amende mais à l'exécution du programme appelera la mauvaise fonction . Il appellera la fonction de la classe de base plutôt que votre substitution.

Il peut s'agir d'un bogue vraiment difficile à trouver: xxx


1 commentaires

et Notez également que c'est probablement plus propre à omettre le maintenant redondant virtuel , i.e. int FINC () remplacer