7
votes

Surcharge '<<' avec héritage et polymorphisme?

Ce qui suit est un échantillon approximatif de ce que le code ressemble à la question, la question est de savoir comment puis-je avoir dérivéOne et dérivétwo avoir un comme pour ce que je vouloir atteindre; Je veux être capable de boucler dans le vecteur des objets et de produire les informations que je lui dises dans la dérivedone et dérivetwo. xxx

maintenant je sais qu'il y a ceci, mais ça ne fonctionnera pas à mes fins. xxx


3 commentaires

Avez-vous essayé d'avoir la déclaration pour chacune des classes dérivées dans chacune d'elles? Je ne suis pas certain , mais je pense que ADL trouvera les fonctions correctes pour vous si vous faites cela.


S'il vous plaît voir la réponse à Stackoverflow.com/questions/2059058/... .


@Draboonwraith: Je ne pense pas que ADL fonctionnera là-bas, car ADL fonctionne sur le type statique de la base , pas le type dynamique.


3 Réponses :


6
votes

Vous pouvez faire quelque chose comme ceci: xxx

puis, lors de l'application opérateur <<< / code> sur base , il appellera le dérivé Méthode de sortie.


1 commentaires

Notez l'utilisation d'une référence dans la liste des paramètres pour opérateur << () .



2
votes

aussi loin que votre problème est décrit, vous avez une collection d'objets polymorphes alloués dynamiquement.

La solution peut changer en fonction de la manière dont ces objets adhérent à certaines disciplines de conception: P>

  1. Êtes-vous un objet "Feam uniquement des objets"? (ne faisant pas référence à un autre objet eux-mêmes)? LI>
  2. n'y a-t-il que des références acycliques simples (votre objet former uniquement des arbres de sous-observations)? Li>
  3. Y a-t-il plusieurs chemins entre les références (un même objet référés par deux ou plusieurs) li>
  4. Y a-t-il des références cycliques? Li>
  5. Y a-t-il des références à d'autres objets les membres em>? li> ol>

    La situation peut devenir très complexe en fonction de la situation et, selon vous si vous pouvez tolérer ou non une production multiple d'un même objet et comment pouvez-vous casser des boucles éventuelles. P>

    une première chose que vous Impossible de faire est d'utiliser base code> en tant que paramètre de valeur (comme dans votre, car cela crée une copie (admettre que vos objets sont copieux: s'ils se réfèrent à un autre objet, que fait une copie? multiplie les chemins? L'objet référé aussi bien?) p>

    Si vous êtes en situation de situation (1.), vous avez juste besoin d'une fonction virtuelle prise std :: ostream et code>, pour être remplacé dans toute la feuille Objets. Ensuite, vous avez besoin d'une surcharge pour opérateur et une autre pour (std :: ostream &, const std std :: vecteur &) code> p>

    comme ceci: p>

    class Derived3: public Base
    {
        ...
        Base* ptrOwnedobject;
    };
    


0 commentaires

16
votes

1 commentaires

Cela fait longtemps que je devais cela, mais votre réponse m'a aidé à me souvenir, merci :)