J'ai une question concernant la liaison précoce / tardive pendant l'héritage du détriment.
Je passe donc des bases OOP pour C ++, et lisez que si vous ne déclarez pas une fonction sur la classe de base virtuelle, vous ne pouvez pas remplacer cela. Cependant, j'ai le code suivant et il semble que mon compilateur le prie de moi quand même. P> La sortie sur mon compilateur est 4, mais en fonction de ce que j'ai lu C ++ a une liaison anticipée et si une fonction n'est pas déclarée virtuelle dans la classe de base, il ne devrait pas être possible de le remplacer afin qu'il devrait produire num + 7 comme indiqué sur la classe de base. Ai-je simplement eu une ressource incorrecte? Ou cela serait-il éventuellement un bug / anomalie dans mon compilateur? P> Merci tout le monde pour votre aide P> P>
4 Réponses :
Plutôt que de tenter d'expliquer, je vous recommande d'essayer l'expérience suivante: puis répétez-le avec book :: SetNumber code> déclaré
virtuel < / code>. p> p>
Vous pouvez "remplacer" des fonctions non virtuelles, mais la mise en œuvre ne sera pas liée de manière dynamique mais statique. Vous réaliserez la différence en conjonction avec le polymorphisme: Ceci invoquera le livre code> -Implementations, alors que lorsque vous aviez déclaré les fonctions membres virtuelles, ce serait lié dynamiquement à la mise en œuvre des magazines. p> p>
+1 Mais je pense que mentionnant remplacer code> et montrant un exemple du code "fixe" aiderait à compléter cette réponse.
Le mot-clé code> virtuel code> n'entre réellement en jeu lorsque vous avez affaire à polymorphisme. Et cela ne se produit que lorsque vous avez des pointeurs / des références.
Si vous avez plutôt fait quelque chose comme: p> vous verrez que nous finirons par appeler si vous déclarez book :: SetNumber () code>, même si nous montrons réellement à un
magazine code>! p>
SETNUMBER code> en tant que
Fonction code> virtuelle et exécutez le code ci-dessus, vous utiliserez une liaison de fonction dynamique. Donc, au lieu d'aller immédiatement appeler
Book :: SetNumber () CODE> Etant donné que nous avons un "code> book" / code> pointeur, le programme vérifiera de manière dynamique pour voir ce que
B code> est en train de pointer vers. Étant donné que c'est en fait un objet code> objet code>, nous appellerons ensuite
magazine :: SetNumber () code>. C'est la magie qui est le polymorphisme. P> p>
"Et cela ne se produit que lorsque vous avez des pointeurs" - ou des références.
Vous ne remplissez pas votre fonction. La chose que vous faites est redéfinir em> p>
Si vous souhaitez être sûr que vous avez annulé la fonction Mettez le mot clé code> de la fonction code> après la déclaration de votre fonction pour voir réellement que vous avez annulé ou non. P>
Exemple: P>
Aussi, il est bon de savoir si vous redéfinissez une fonction "quelle fonction utiliser (Type vérification)" em> se produit à l'heure de la compilation et si vous déclarez votre fonction virtuelle avec le même nom. Via mécanisme de table virtuelle. P> void suspect () remplacer; code> - (C ++ 11 Fonction) P>