0
votes

Héritage primordial

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. xxx

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?

Merci tout le monde pour votre aide


0 commentaires

4 Réponses :


0
votes

Plutôt que de tenter d'expliquer, je vous recommande d'essayer l'expérience suivante: xxx

puis répétez-le avec book :: SetNumber déclaré virtuel < / code>.


0 commentaires

5
votes

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: xxx

Ceci invoquera le livre -Implementations, alors que lorsque vous aviez déclaré les fonctions membres virtuelles, ce serait lié dynamiquement à la mise en œuvre des magazines.


1 commentaires

+1 Mais je pense que mentionnant remplacer et montrant un exemple du code "fixe" aiderait à compléter cette réponse.



1
votes

Le mot-clé virtuel 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: xxx

vous verrez que nous finirons par appeler book :: SetNumber () , même si nous montrons réellement à un magazine !

si vous déclarez SETNUMBER en tant que Fonction 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 () Etant donné que nous avons un "code> book" / code> pointeur, le programme vérifiera de manière dynamique pour voir ce que B est en train de pointer vers. Étant donné que c'est en fait un objet objet , nous appellerons ensuite magazine :: SetNumber () . C'est la magie qui est le polymorphisme.


1 commentaires

"Et cela ne se produit que lorsque vous avez des pointeurs" - ou des références.



4
votes

Vous ne remplissez pas votre fonction. La chose que vous faites est redéfinir

Si vous souhaitez être sûr que vous avez annulé la fonction Mettez le mot clé de la fonction après la déclaration de votre fonction pour voir réellement que vous avez annulé ou non.

Exemple:

void suspect () remplacer; - (C ++ 11 Fonction)

Aussi, il est bon de savoir si vous redéfinissez une fonction "quelle fonction utiliser (Type vérification)" 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.


0 commentaires