L
@DNKpp Ja unter einem Interface verstehe ich per se erstmal nur abstrakte Klassen bzw. pure virtual Methoden. Weiter gefasst tut es hier auch eine Basisklasse mit virtuellen Funktionen, soweit ich das verstanden habe.
Zu deinem Ergebnis bin ich auch gekommen. Keine virtuellen methoden außer dtor, aber virtuelle Vererbung. Soweit ich virtuelle Vererbung verstanden ist das aber nur für Multi Vererbung. Wenn eine Klasse A von einer Klasse B quasi 2x erbt durch unterschiedliche Vererbungspfade. Dann aber den ganzen Kram von B nur einmal enthält und eben nicht mehrfach.
@hustbaer sagte in Unit Testen einer Funktion, die im Fehlerfall nicht stoppt:
Naja die iostreams unterstützen schon Polymorphie. Aber halt nicht indem man einfach ein paar virtuelle Methoden direkt in den Stream-Klassen überschreibt. Man muss dazu wie schon gesagt einen eigenen Stream-Buffer (std::streambuf) implementieren und dann einen Stream mit diesem Stream-Buffer erzeugen.
Beispiel wie das geht siehst du z.B. hier: https://stackoverflow.com/questions/14086417/how-to-write-custom-input-stream-in-c
Hieraus lese ich zumindest, dass es sinnvoll ist lieber den streambuff zu überschreiben und diesen dann mit einem "normalen" istream / ostream zu nutzen. Das taugt für meinen Anwendungsfall eher nicht so. Dann müsste ich, wie du ja sagst, den Mock selbst schreiben mit entsprechenden Assertionen Funktionen und das erscheint mir auch fummelig.
Die erste Frage, die sich mir aber direkt stellt ist: Wie macht denn ostringstream /istringstream das? Da wurde ja nicht (nur?) der Buffer ausgetauscht, sondern tatsächlich richtig eine Subklasse von istream/ostream erstellt. Mit dem klappt auch alles wunderbar. Daraus schließe ich ja, dass man schon doch irgendwie richtig subclassen kann.
Ich habe schon grob mitbekommen, dass das nicht unbedingt einfach geht. Nicht zuletzt weil da ja auch ganz viel template im Spiel ist und das ja nur typedefs sind. Aber mich würde schon grob interessieren wie das überhaupt gehen kann.
Ich liege doch hier richtig, dass keine Methode in ostream virtual ist? Wie kann also doch Polymorphie funktionieren?
Ich vermute mal, wenn du sagst, dass ist ne bescheuerte Idee, dann wirst du damit recht haben. Du kennst dich ja schon ganz gut aus Aber würde gerne noch etwas mehr verstehen, warum es ne bescheuerte Idee ist ostream zu subclassen.
Vlt. möchte ich das Szenario auch mal vereinfachen. Ich möchte nicht mehr, dass irgendwelche Assertions gemacht werden oder in irgendeine Art von Buffer geschrieben wird, sondern das einfach gar nichts passiert. Rein gar nichts Also sprich alle Methoden (oder zumindest die relevante Operatoren etc.) sollen komplett leer sein.
Warum ist das schwierig, was ist da das Problem? (Meine Vermutung ist ja: Weil nicht virtual ... siehe Frage oben)
Wenn ich eine ultra komplexe Klasse A habe und die eine Methode "foo" hat, die virtual ist. Dann kann ich doch eig. super easy überschreiben, wenn mein eigentliches Ziel nur ist, dass die Funktion gar nichts macht. Die einzigen Probleme, die mir da evtl. einfallen sind:
Überladungen
Templates
Damit wird es vlt. etwas kniffliger, aber klingt erstmal noch nach nem lösbaren Problem.