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.