D'accord, j'ai donc eu deux classes.
blah[5].print();
4 Réponses :
déclarer a :: print () code> comme virtuel et utilisez
Imprimer () code>. Lorsque vous faites
BLAH [5] = B () CODE>, il fait la tranchée d'objet. Vous n'avez aucun effet appelant une fonction virtuelle à l'aide d'un objet. P>
Ceci peut être corrigé en déclarant la fonction virtuelle, A la: Voici comment on implémente le polymorphisme en C ++. Plus ici: http://fr.wikipedia.org/wiki/virtual_function P> < P> Cependant, il convient de noter que dans votre exemple, il n'appellera jamais la fonction enfant, car vous utilisez des valeurs d'objet em>, pas des pointeurs / références aux objets. Pour remédier à cela, p> alors: p>
Cela le fait parce que vous avez dit au compilateur que votre instance était de type Bien sûr, vous voulez la méthode dans Parce que lorsque vous lancez votre objet à la classe mère, vous avez introduit une ambiguïté. Lorsque cet objet à désambiguate, le mot clé code> virtuel > est introduit. acclamations! p> p> A code>. C'est dans un tableau de
A code> d'objets, non? Donc, il est de type
a code>!
B code> pour écraser celui de
A code>, malgré une référence du type parent. Vous pouvez obtenir ce comportement à l'aide du mot-clé code> virual de code> sur la déclaration de fonction dans la classe mère. P>
Imprimer () CODE> est appelé, comment devrions-nous le traiter? Il est de type
B code>, mais la référence est de type
A code>, de sorte que le code sodyfining peut s'attendre à ce qu'il se comporte comme
A code>, pas
B code>! p>
Les fonctions virtuelles > sont toujours remplacées si l'objet est d'une classe enfant contenant une méthode avec la même signature. p>
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 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 alors vous pouvez appeler: p> et il appellera la mise en œuvre Vous devriez plus tard 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é. (il est plus normal d'utiliser des vecteurs avec virtuel code> dans la classe de base
a code>:
Nouveau p>
B code> de
Imprimer () Code>. p>
Supprimer bla [5] code> (et tout autre que vous avez signalé à la mémoire renvoyé par
Nouveau code>). P >
std :: vecteur <> code> est l'un de ces conteneurs. Vous pouvez également utiliser des pointeurs intelligents pour automatiser la suppression du
A code> et
b code>. Cela aide à rendre le code correct si des exceptions sont projetées avant que vos instructions code> Supprimer code> 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: p>
push_back () code>, 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 () Code>.) P> P>