9
votes

Appelez une version enfant d'une fonction au lieu d'un parents?

D'accord, j'ai donc eu deux classes.

blah[5].print();


0 commentaires

4 Réponses :


-1
votes

déclarer a :: print () comme virtuel et utilisez Pointeur / référence pour appeler la fonction Imprimer () . Lorsque vous faites BLAH [5] = B () , il fait la tranchée d'objet. Vous n'avez aucun effet appelant une fonction virtuelle à l'aide d'un objet.


0 commentaires

13
votes

Ceci peut être corrigé en déclarant la fonction virtuelle, A la: xxx

Voici comment on implémente le polymorphisme en C ++. Plus ici: http://fr.wikipedia.org/wiki/virtual_function < P> Cependant, il convient de noter que dans votre exemple, il n'appellera jamais la fonction enfant, car vous utilisez des valeurs d'objet , pas des pointeurs / références aux objets. Pour remédier à cela, xxx

alors: xxx


0 commentaires

0
votes

Cela le fait parce que vous avez dit au compilateur que votre instance était de type A . C'est dans un tableau de A d'objets, non? Donc, il est de type a !

Bien sûr, vous voulez la méthode dans B pour écraser celui de A , malgré une référence du type parent. Vous pouvez obtenir ce comportement à l'aide du mot-clé virual sur la déclaration de fonction dans la classe mère. xxx

pourquoi ça marche comme ça? < / strong>

Parce que lorsque vous lancez votre objet à la classe mère, vous avez introduit une ambiguïté. Lorsque cet objet Imprimer () est appelé, comment devrions-nous le traiter? Il est de type B , mais la référence est de type A , de sorte que le code sodyfining peut s'attendre à ce qu'il se comporte comme A , pas B !

à désambiguate, le mot clé virtuel est introduit. Les fonctions virtuelles sont toujours remplacées si l'objet est d'une classe enfant contenant une méthode avec la même signature.

acclamations!


0 commentaires

3
votes

Qu'est-ce que vous recherchez est le polymorphisme de temps d'exécution, ce qui signifie que l'objet doit prendre "de nombreuses formes" (c'est-à-dire A ou B) et agir en conséquence, comme le programme est exécuté. En C ++, vous le faites en faisant la fonction virtuel dans la classe de base a : xxx

alors, vous devez stocker les éléments. Par pointeur ou référence, et - comme en général, les classes dérivées peuvent introduire de nouveaux membres de données et avoir besoin de plus de stockage - il est normal de créer les objets sur le tas avec Nouveau xxx

alors vous pouvez appeler: xxx

et il appellera la mise en œuvre B de Imprimer () .

Vous devriez plus tard Supprimer bla [5] (et tout autre que vous avez signalé à la mémoire renvoyé par Nouveau ).

En pratique, c'est une bonne idée d'utiliser un conteneur pouvant supprimer les objets qu'il contient lorsqu'il est en soi détruit, que ce soit en raison de la sortie de la portée ou d'être supprimé. std :: vecteur <> est l'un de ces conteneurs. Vous pouvez également utiliser des pointeurs intelligents pour automatiser la suppression du A et b . Cela aide à rendre le code correct si des exceptions sont projetées avant que vos instructions Supprimer sont exécutées et que vous souhaitez que votre programme continue à fonctionner sans fuir la mémoire. La bibliothèque de Boost est le plus simple / meilleur pour obtenir une mise en œuvre intelligente du pointeur. Ensemble: xxx

(il est plus normal d'utiliser des vecteurs avec push_back () , car il grandit automatiquement le vecteur dans tous les éléments que vous " J'ai ajouté, avec le nouveau total disponible en appelant Vector :: Taille () .)


0 commentaires