11
votes

Surcharge << opérateurs et classes héritées

J'ai une classe de base, puis plusieurs classes dérivées. Je voudrais surcharger l'opérateur " xxx pré>

dans ma classe, puis définissez la fonction après la classe. A priori, je penserais ajouter de virtuellement à la définition ci-dessus le ferait fonctionner, mais après une pensée (et des erreurs de mon compilateur), je me rends compte que cela n'a pas beaucoup de sens. P>

J'ai essayé une autre punaise sur un cas de test, où tous les membres de la classe sont publics. Par exemple: P>

class Foo{
 //bla
};

ostream& operator<<(ostream& out, Foo& foo){
  cout << "Foo" << endl;
  return foo;
}

class Bar : public Foo{
 //bla
};

ostream& operator<<(ostream& out, Bar& bar){
  cout << "Bar" << endl;
  return bar;
}

///////////////////////

Bar bar = Bar();
cout << bar << endl; // outputs 'Foo', not 'Bar' 


0 commentaires

4 Réponses :


1
votes

faire opérateur <<< / code> une fonction libre qui transfère l'appel à un méthode de la classe de classe foo .

Le voir en action . .


0 commentaires

3
votes

Généralement, vous venez de créer une méthode polymorphe imprimer dans la classe de base qui est appelée par une seule fonction d'ami gratuit.


1 commentaires

Si imprimé est public, nous pouvons abandonner l'ami.



8
votes

Vous pouvez utiliser une fonction d'aide virtuelle. Voici un exemple complètement non testé, alors excusez toutes les erreurs de syntaxe: xxx

EDIT: nettoyé par des suggestions @omnifarious.


4 commentaires

Je pense que cela a deux défauts. Une faille est une énorme défaute et l'autre est une faille mineure. Énorme défaut d'abord ... Vous ne devez jamais mettre de manière invisible dans endl . endl oblige un flux de flush, qui peut être un gros problème de performance dans certaines circonstances. Utilisez '\ n' . Il est garanti d'être aussi portable (en fait, endl est défini en termes de sortie '\ n' et n'aboutit pas une surcharge de rinçage. Deuxièmement, je voudrais Faites ceci: retourner << "foo \ n"; . Se sent légèrement plus propre. Il transforme conceptuellement le tout en une longue chaîne de <<< / code>.


@Omnifarious je ne mettrais jamais endl dans un opérateur <<< / code> surcharge. Je voulais juste suivre le code de l'OP.


De côté, je pense que c'était une erreur d'avoir déjà mis le manipulateur endl iostream dans la langue du tout. Il existe déjà un manipulateur Flush et le manipulateur endl Deux opérations qui doivent toujours être distinctes.


@OMnifarious intéressant, je ne savais même pas que cela existait.



1
votes

avec les corrections de code appropriées en place, votre code fonctionne bien; Rien à faire : xxx

démo . Pour accéder aux membres privé , vous pouvez faire cette fonction comme ami dans la classe souhaitée .


1 commentaires

Intrigant. Dans mon code en fait, j'avais utilisé correctement au lieu de COUT, mais cela n'a toujours pas fonctionné. Il doit y avoir quelque chose de subtiller sur le N'est-il pas capturé par les classes de remplissage // bla.