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'
4 Réponses :
faire Le voir en action strong>. P>. opérateur <<< / code> une fonction libre qui transfère l'appel à un
méthode de la classe code> de classe
foo code>. P>
Généralement, vous venez de créer une méthode polymorphe imprimer code> dans la classe de base qui est appelée par une seule fonction d'ami gratuit. P>
Si imprimé est public, nous pouvons abandonner l'ami.
Vous pouvez utiliser une fonction d'aide virtuelle. Voici un exemple complètement non testé, alors excusez toutes les erreurs de syntaxe: EDIT: strong> nettoyé par des suggestions @omnifarious. P> P>
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 code>.
endl code> oblige un flux de flush, qui peut être un gros problème de performance dans certaines circonstances. Utilisez
'\ n' code>. Il est garanti d'être aussi portable (en fait,
endl code> est défini en termes de sortie
'\ n' code> et n'aboutit pas une surcharge de rinçage. Deuxièmement, je voudrais Faites ceci:
retourner << "foo \ n"; code>. 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 code> 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 code> endl code> iostream dans la langue du tout. Il existe déjà un manipulateur code> Flush code> et le manipulateur code> endl code> Deux opérations qui doivent toujours être distinctes.
@OMnifarious intéressant, je ne savais même pas que cela existait.
avec les corrections de code appropriées en place, votre code démo . Pour accéder aux membres privé code>, vous pouvez faire cette fonction comme
ami code> dans la classe
souhaitée code>. P> p>
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.