Vererbung in C++
Beispiel
Es wird zunächst offengelassen, wie der Ausgabestrom implementiert wird.
writeAlphaTo arbeitet auf einem Obertyp (einer Schnittstelle).
main.cpp
#include <ostream>
#include <iostream>
#include <sstream>
#include <fstream>
#include <cassert>
void writeAlphaTo( ::std::ostream & out ){ out << "alpha\n"; }
int main()
{ { ::std::ostringstream string_sink;
writeAlphaTo( string_sink );
::std::cout << "string_sink: " << string_sink.str(); }
{ ::std::ofstream file( "tmp.txt" );
writeAlphaTo( file ); }
{ ::std::cout << "file: " << ::std::ifstream( "tmp.txt" ).rdbuf(); }
{ writeAlphaTo( ::std::cout ); }}::std::cout
string_sink: alpha
file: alpha
alpha
Werden die inneren geschweiften Klammer in »main« entfernt, so wird die Dateiausgabe nicht mehr unbedingt sichtbar, da die Datei dann noch nicht geschlossen wurde, wenn sie wieder ausgelesen werden soll. Dies ist mal ein Beispiel dafür, daß ein innerer Block in C++ eine Bedeutung hat.
Vererbung
Algorithmus auf Schnittstelle writeAlphaTo
|
c
Obertyp/Schnittstelle ostream
^
|
.-------------------------'-------------------------.
| | |
Untertypen/Implementation ostringstream | ofstream
|
Exemplare ::std::cout
Da ostringstream und ofstream beides Untertypen von ostream sind, dürfen ihre Ausdrücke verwendet werden, wo eine Ausdruck vom Typ ostream erlaubt ist. ::std::cout ist ein Exemplar eines Typs, der ostream oder eine Untertyp davon ist. Im Begriff „Algorithmus auf Schnittstelle“ ist das Wort „Algorithmus“ nicht im Sinne der C++ -Standardbibliothek gemeint.