MÜNSTER Übung zur Vorlesung Wissenschaftliches Rechnen Sommersemester 2012 Auffrischung zur Programmierung in C++ 2. Teil 18. April 2012
Organisatorisches MÜNSTER Übung zur Vorlesung Wissenschaftliches Rechnen SS 2012 2 /22 Gestern Ausgabe des ersten Übungszettels: Abgabe Dienstag pünktlich 10:00 Uhr Briefkasten 89 Hat jeder einen Partner für die Abgabe?
Organisatorisches MÜNSTER Übung zur Vorlesung Wissenschaftliches Rechnen SS 2012 2 /22 Gestern Ausgabe des ersten Übungszettels: Abgabe Dienstag pünktlich 10:00 Uhr Briefkasten 89 Hat jeder einen Partner für die Abgabe? Erinnerung: Schriftliche Abgabe Code zusätzlich per e-mail Code muss kompilieren sonst wird er nicht bewertet
Organisatorisches MÜNSTER Übung zur Vorlesung Wissenschaftliches Rechnen SS 2012 2 /22 Gestern Ausgabe des ersten Übungszettels: Abgabe Dienstag pünktlich 10:00 Uhr Briefkasten 89 Hat jeder einen Partner für die Abgabe? Erinnerung: Schriftliche Abgabe Code zusätzlich per e-mail Code muss kompilieren sonst wird er nicht bewertet Für Nachzügler: e-mail an sebastian.westerheide@uni-muenster.de
MÜNSTER Übung zur Vorlesung Wissenschaftliches Rechnen SS 2012 3 /22 Erinnerung Eingliederung C++ C++: Imperative Programmiersprache Hybrider Ansatz: Prozedurale und objektorientierte Programmierung möglich
MÜNSTER Übung zur Vorlesung Wissenschaftliches Rechnen SS 2012 4 /22 Überblick über die ersten beiden Übungsstunden Letzte Woche: Auffrischung zur prozeduralen Programmierung in C++ Heute: Auffrischung zur objektorientierten Programmierung in C++
MÜNSTER Übung zur Vorlesung Wissenschaftliches Rechnen SS 2012 4 /22 Überblick über die ersten beiden Übungsstunden Letzte Woche: Auffrischung zur prozeduralen Programmierung in C++ Heute: Grundlegende Syntax Basisdatentypen Wichtige Operatoren Kontrollstrukturen Prozeduren Wertparameter vs. Referenzparameter Pointer und Referenzen Auffrischung zur objektorientierten Programmierung in C++
MÜNSTER Übung zur Vorlesung Wissenschaftliches Rechnen SS 2012 4 /22 Überblick über die ersten beiden Übungsstunden Letzte Woche: Auffrischung zur prozeduralen Programmierung in C++ Heute: Auffrischung zur objektorientierten Programmierung in C++
MÜNSTER Übung zur Vorlesung Wissenschaftliches Rechnen SS 2012 4 /22 Überblick über die ersten beiden Übungsstunden Letzte Woche: Auffrischung zur prozeduralen Programmierung in C++ Heute: Auffrischung zur objektorientierten Programmierung in C++ Motivation Klassen und Objekte Klassendesign Konstruktoren Datenkapselung Vererbung Virtuelle Methoden Abstrakte Methoden Abstrakte Klassen Interfaces
Motivation (1/3) MÜNSTER Übung zur Vorlesung Wissenschaftliches Rechnen SS 2012 5 /22 Prozedurale Programmierung: Aufbau der Programme aus Teilproblemen (Prozeduren) Es gibt Daten und Prozeduren
Motivation (1/3) MÜNSTER Übung zur Vorlesung Wissenschaftliches Rechnen SS 2012 5 /22 Prozedurale Programmierung: Aufbau der Programme aus Teilproblemen (Prozeduren) Es gibt Daten und Prozeduren Prozeduren: Lesen oder Verändern lokaler Daten Aufruf von Prozeduren in Abhängigkeit von Parametern Diese enthalten Daten die weiter verarbeitet werden können Rückgabe der bearbeiteten Daten an den Aufrufer
Motivation (1/3) MÜNSTER Übung zur Vorlesung Wissenschaftliches Rechnen SS 2012 5 /22 Prozedurale Programmierung: Aufbau der Programme aus Teilproblemen (Prozeduren) Es gibt Daten und Prozeduren Prozeduren: Lesen oder Verändern lokaler Daten Aufruf von Prozeduren in Abhängigkeit von Parametern Diese enthalten Daten die weiter verarbeitet werden können Rückgabe der bearbeiteten Daten an den Aufrufer Nachteil: Die Daten sind unabhängig von den Anweisungen Jede Anweisung kann gültige Daten lesen oder verändern Falls globale Daten verändert werden können die Folgen für das Programm nicht abgeschätzt werden Wie Daten und Prozeduren zusammenhängen steht nur in den Kommentaren
MÜNSTER Übung zur Vorlesung Wissenschaftliches Rechnen SS 2012 6 /22 Motivation (2/3) Beispiel 1 double kreis_umfang ( double r a d i u s ) ; double k r e i s _ f l a e c h e ( double r a d i u s ) ; 3 double rechteck_umfang ( double hoehe double b r e i t e ) ; double r e c h t e c k _ f l a e c h e ( double hoehe double b r e i t e ) ; 5... 7 i n t main ( ) { 9 double hoehe ; double b r e i t e ; 11 double r a d i u s ;... 13 } Daten und Prozeduren sind getrennt man könnte auch kreis_flaeche (hoehe) aufrufen
Motivation (3/3) MÜNSTER Übung zur Vorlesung Wissenschaftliches Rechnen SS 2012 7 /22 Objektorientierte Programmierung: Zusammenfassung von Daten die ein Objekt beschreiben und Prozeduren zum Ändern dieser Daten
Motivation (3/3) MÜNSTER Übung zur Vorlesung Wissenschaftliches Rechnen SS 2012 7 /22 Objektorientierte Programmierung: Zusammenfassung von Daten die ein Objekt beschreiben und Prozeduren zum Ändern dieser Daten Gegenstände der realen Welt werden abstrahiert um sie im Programm abzubilden
Motivation (3/3) MÜNSTER Übung zur Vorlesung Wissenschaftliches Rechnen SS 2012 7 /22 Objektorientierte Programmierung: Zusammenfassung von Daten die ein Objekt beschreiben und Prozeduren zum Ändern dieser Daten Gegenstände der realen Welt werden abstrahiert um sie im Programm abzubilden Es werden Klassen erstellt um Gruppen von Objekten zu beschreiben Objekte erstellt um einen Gegenstand aus der realen Wert abzubilden Nachrichten zwischen Objekten verschickt
Motivation (3/3) MÜNSTER Übung zur Vorlesung Wissenschaftliches Rechnen SS 2012 7 /22 Objektorientierte Programmierung: Zusammenfassung von Daten die ein Objekt beschreiben und Prozeduren zum Ändern dieser Daten Gegenstände der realen Welt werden abstrahiert um sie im Programm abzubilden Es werden Klassen erstellt um Gruppen von Objekten zu beschreiben Objekte erstellt um einen Gegenstand aus der realen Wert abzubilden Nachrichten zwischen Objekten verschickt Vorteile: Hilft bei der Strukturierung des Programms Reduziert mögliche Fehlerquellen Erleichtert die Wiederverwendung und Weiterentwicklung
MÜNSTER Übung zur Vorlesung Wissenschaftliches Rechnen SS 2012 8 /22 Klassen und Objekte Klassen beschreiben die Struktur von Objekten Objekte sind Instanzen einer Klasse Jede neue Klasse ist ein neuer Datentyp
MÜNSTER Übung zur Vorlesung Wissenschaftliches Rechnen SS 2012 8 /22 Klassen und Objekte Klassen beschreiben die Struktur von Objekten Objekte sind Instanzen einer Klasse Jede neue Klasse ist ein neuer Datentyp Klassen haben Eigenschaften (Attribute / Member-variables) Attribute beschreiben einen Gegenstand Jede Instanz einer Klasse besitzt die gleichen Eigenschaften Jedes Objekt hat aber bestimmte Attributwerte die das Objekt von anderen Objekten unterscheidet Attribute werden in C++ durch Variablen von einem bestimmten Datentyp dargestellt Methoden (Member-functions)
MÜNSTER Übung zur Vorlesung Wissenschaftliches Rechnen SS 2012 8 /22 Klassen und Objekte Klassen beschreiben die Struktur von Objekten Objekte sind Instanzen einer Klasse Jede neue Klasse ist ein neuer Datentyp Klassen haben Eigenschaften (Attribute / Member-variables) Methoden (Member-functions) Methoden können die Eigenschaft eines Objekts verändern Objekte teilen Informationen über sich selbst durch Methoden mit Objekte nutzen Methoden um mit anderen Objekten zu kommunizieren
Klassendesign MÜNSTER Übung zur Vorlesung Wissenschaftliches Rechnen SS 2012 9 /22 Klassen entsprechen Substantiven in einer Problembeschreibung Ein Rechteck hat ein Breite b und eine Höhe h Daten in einer Klasse beschreiben Eigenschaften / Attribute Methoden in einer Klasse ändern Attribute / Daten oder geben einem darauf Zugriff
Klassendesign MÜNSTER Übung zur Vorlesung Wissenschaftliches Rechnen SS 2012 9 /22 Klassen entsprechen Substantiven in einer Problembeschreibung Daten in einer Klasse beschreiben Eigenschaften / Attribute Ein Rechteck hat ein Breite b und eine Höhe h Methoden in einer Klasse ändern Attribute / Daten oder geben einem darauf Zugriff
Klassendesign MÜNSTER Übung zur Vorlesung Wissenschaftliches Rechnen SS 2012 9 /22 Klassen entsprechen Substantiven in einer Problembeschreibung Daten in einer Klasse beschreiben Eigenschaften / Attribute Methoden in einer Klasse ändern Attribute / Daten oder geben einem darauf Zugriff Der Flächeninhalt des Rechtecks ist A = b h Der Umfang des Rechtecks ist U = 2 (b + h)
MÜNSTER Übung zur Vorlesung Wissenschaftliches Rechnen SS 2012 10 /22 Beispiel Klassendeklaration // K l a s s e n d e k l a r a t i o n 2 c l a s s Rechteck { 4 // Daten des Rechtecks double hoehe ; 6 double b r e i t e ; 8 p u b l i c : // K o n s t r u k t o r 10 Rechteck ( double h double b ) : hoehe ( h ) b r e i t e ( b ) { } 12 // Berechnungen double umfang ( ) ; 14 double f l a e c h e ( ) ; } ;
MÜNSTER Übung zur Vorlesung Wissenschaftliches Rechnen SS 2012 11 /22 Beispiel Implementierung 1 // Implementierung double Rechteck : : umfang ( ) 3 { r e t u r n 2 ( hoehe+ b r e i t e ) ; 5 } 7 double Rechteck : : f l a e c h e ( ) { 9 r e t u r n hoehe b r e i t e ; }
MÜNSTER Übung zur Vorlesung Wissenschaftliches Rechnen SS 2012 12 /22 Beispiel Hauptprogramm // K l a s s e n d e k l a r a t i o n und Implementierung laden 2 # i n c l u d e " 02 _Rechteck. hh " # i n c l u d e " 02 _Rechteck. cc " 4 # i n c l u d e < iostream > 6 i n t main ( ) 8 { // Ein Objekt vom Typ Rechteck i n s t a n z i i e r e n 10 Rechteck r ( 3. 5 4. 2 ) ; std : : cout < < r. f l a e c h e ( ) < < std : : endl ; 12 }
MÜNSTER Übung zur Vorlesung Wissenschaftliches Rechnen SS 2012 13 /22 Beispiel Insgesamt # include < iostream > 2 // K l a s s e n d e k l a r a t i o n 4 c l a s s Rechteck { 6 // Daten des Rechtecks double hoehe ; 8 double b r e i t e ; public : 10 // K o n s t r u k t o r Rechteck ( double h double b ) : hoehe (h) b r e i t e (b) { } 12 // Berechnungen double umfang ( ) ; 14 double f l a e c h e ( ) ; } ; 16 i n t main ( ) 18 { // Ein Objekt vom Typ Rechteck i n s t a n z i i e r e n 20 Rechteck r ( 3. 5 4. 2 ) ; std : : cout < < r. f l a e c h e ( ) < < std : : endl ; 22 } 24 // Implementierung double Rechteck : : umfang ( ) 26 { return 2 ( hoehe+ b r e i t e ) ; 28 } double Rechteck : : f l a e c h e ( ) 30 { return hoehe b r e i t e ; 32 }
Konstruktoren MÜNSTER Übung zur Vorlesung Wissenschaftliches Rechnen SS 2012 14 /22 Konstruktoren erzeugen eine neue Instanz einer Klasse Spezielle Methoden die der Initialisierung der Klasse dienen
Konstruktoren MÜNSTER Übung zur Vorlesung Wissenschaftliches Rechnen SS 2012 14 /22 Konstruktoren erzeugen eine neue Instanz einer Klasse Spezielle Methoden die der Initialisierung der Klasse dienen Sie bestehen aus drei Teilen: Methodenkopf Initialisierung der Variablen Methodenrumpf // D e f a u l t K o n s t r u k t o r 2 Rechteck ( ) : hoehe ( 1. 0 ) b r e i t e ( 2. 0 ) { } // S p e z i e l l e r K o n s t r u k t o r 4 Rechteck ( double h double b ) : hoehe ( h ) breite ( b ) { }
Konstruktoren MÜNSTER Übung zur Vorlesung Wissenschaftliches Rechnen SS 2012 14 /22 Konstruktoren erzeugen eine neue Instanz einer Klasse Spezielle Methoden die der Initialisierung der Klasse dienen Sie bestehen aus drei Teilen: Methodenkopf Initialisierung der Variablen Methodenrumpf // D e f a u l t K o n s t r u k t o r 2 Rechteck ( ) : hoehe ( 1. 0 ) b r e i t e ( 2. 0 ) { } // S p e z i e l l e r K o n s t r u k t o r 4 Rechteck ( double h double b ) : hoehe ( h ) breite ( b ) { } Beim Erzeugen einer Instanz wird der Konstruktor aufgerufen: // D e f a u l t K o n s t r u k t o r 2 Rechteck r ; // S p e z i e l l e r K o n s t r u k t o r 4 Rechteck r ( 2. 3 4. 5 ) ;
Datenkapselung MÜNSTER Übung zur Vorlesung Wissenschaftliches Rechnen SS 2012 15 /22 Die Daten und Methoden eines Objekts werden zusammengefasst Die Daten werden vor einem Zugriff von außen geschützt Attributwerte sind von außen nicht sichtbar Daten können nur über bestimmte Schnittstellen verändert oder gelesen werden Die Implementierung von Methoden ist nach außen hin nicht sichtbar Der Nutzer der Methode kennt nur die Eingangs- und Ausgangswerte der Methode
MÜNSTER Übung zur Vorlesung Wissenschaftliches Rechnen SS 2012 16 /22 // K l a s s e n d e k l a r a t i o n 2 c l a s s Rechteck { 4 // Daten des Rechtecks double hoehe ; 6 double b r e i t e ; 8 p u b l i c : // K o n s t r u k t o r 10 Rechteck ( double h double b ) : hoehe ( h ) b r e i t e ( b ) { } 12 // Berechnungen double umfang ( ) ; 14 double f l a e c h e ( ) ; } ;
MÜNSTER Übung zur Vorlesung Wissenschaftliches Rechnen SS 2012 16 /22 // K l a s s e n d e k l a r a t i o n 2 c l a s s Rechteck { 4 // Daten des Rechtecks double hoehe ; 6 double b r e i t e ; 8 p u b l i c : // K o n s t r u k t o r 10 Rechteck ( double h double b ) : hoehe ( h ) b r e i t e ( b ) { } 12 // Berechnungen double umfang ( ) ; 14 double f l a e c h e ( ) ; } ; 1 // Daten des Rechtecks double hoehe ; 3 double b r e i t e ; private : Der Zugriff auf Methoden oder Attribute ist von außen her nicht möglich Ein Zugriff von außen ist nicht zulässig Attribute einer Klasse werden meist mit private deklariert Standardmäßig sind alle Elemente einer Klasse privat
MÜNSTER Übung zur Vorlesung Wissenschaftliches Rechnen SS 2012 16 /22 // K l a s s e n d e k l a r a t i o n 2 c l a s s Rechteck { 4 // Daten des Rechtecks double hoehe ; 6 double b r e i t e ; p u b l i c : 2 // K o n s t r u k t o r Rechteck ( double h double b ) ; 4 // Berechnungen double umfang ( ) ; 6 double f l a e c h e ( ) ; 8 p u b l i c : // K o n s t r u k t o r 10 Rechteck ( double h double b ) : hoehe ( h ) b r e i t e ( b ) { } 12 // Berechnungen double umfang ( ) ; 14 double f l a e c h e ( ) ; } ; public: Die Methoden und Attribute sind öffentlich zugänglich Objekte beliebiger Klassen können auf diese Methoden und Attribute zugreifen Methoden die Eigenschaften verändern sind meist public deklariert
Vererbung MÜNSTER Übung zur Vorlesung Wissenschaftliches Rechnen SS 2012 17 /22 Vererbung dient dazu aufbauend auf existierenden Klassen neue zu schaffen
Vererbung MÜNSTER Übung zur Vorlesung Wissenschaftliches Rechnen SS 2012 17 /22 Vererbung dient dazu aufbauend auf existierenden Klassen neue zu schaffen Eine neue Klasse ist dann eine Erweiterung der ursprünglichen Basisklasse d.h. eine Spezialisierung Die Spezialisierungen werden abgeleitete Klassen oder Unterklassen genannt
Vererbung MÜNSTER Übung zur Vorlesung Wissenschaftliches Rechnen SS 2012 17 /22 Vererbung dient dazu aufbauend auf existierenden Klassen neue zu schaffen Eine neue Klasse ist dann eine Erweiterung der ursprünglichen Basisklasse d.h. eine Spezialisierung Die Spezialisierungen werden abgeleitete Klassen oder Unterklassen genannt Unterklassen erben Struktur und Verhalten ihrer Basisklasse Wiederverwendung der vorhandenen Methoden
MÜNSTER Übung zur Vorlesung Wissenschaftliches Rechnen SS 2012 18 /22 Beispiel Vererbung / 2 Klasse M i t g l i e d : R e p r a e s e n t i e r t das M i t g l i e d e i n e r Schule ; z. B. Hausmeister Lehrer Schueler... 4 / c l a s s M i t g l i e d 6 { p r i v a t e : 8 std : : s t r i n g vorname ; // h i e r kommen dann noch die anderen Daten 10 p u b l i c : 12 // K o n s t r u k t o r M i t g l i e d ( std : : s t r i n g v ) : vorname ( v ) { } ; 14 // Lesen / Schreiben der Vornamens 16 std : : s t r i n g lesevorname ( ) ; void schreibevorname ( std : : s t r i n g v ) ; 18 } ;
MÜNSTER Übung zur Vorlesung Wissenschaftliches Rechnen SS 2012 18 /22 Beispiel Vererbung / 2 Klasse Schueler : E r w e i t e r t Klasse M i t g l i e d ; Z u s a e t z l i c h hat der Schueler die I n f o r m a t i o n i n welcher Klasse er i s t 4 / c l a s s Schueler : p u b l i c M i t g l i e d 6 { p r i v a t e : 8 i n t klasse ; // h i e r kommen dann noch die anderen Daten 10 p u b l i c : 12 // K o n s t r u k t o r Schueler ( std : : s t r i n g v i n t k ) : M i t g l i e d ( v ) klasse ( k ) { } ; 14 // Lesen / Schreiben der Klasse 16 i n t l e s e K l a s s e ( ) ; void s c h r e i b e K l a s s e ( i n t k ) ; 18 } ;
Virtuelle Methoden MÜNSTER Übung zur Vorlesung Wissenschaftliches Rechnen SS 2012 19 /22 Methoden die von einer Unterklasse durch eine Methode gleicher Signatur überschrieben werden können Erst zur Laufzeit wird bestimmt welche Variante verwendet wird (dynamisches Binden)
Virtuelle Methoden MÜNSTER Übung zur Vorlesung Wissenschaftliches Rechnen SS 2012 19 /22 Methoden die von einer Unterklasse durch eine Methode gleicher Signatur überschrieben werden können Erst zur Laufzeit wird bestimmt welche Variante verwendet wird (dynamisches Binden) Sofern vorhanden wird die Implementierung der Unterklasse verwendet Wenn eine Unterklasse eine virtuelle Methode einer Basisklasse nicht überschreibt wird die Methode der Basisklasse genutzt
Virtuelle Methoden MÜNSTER Übung zur Vorlesung Wissenschaftliches Rechnen SS 2012 19 /22 Methoden die von einer Unterklasse durch eine Methode gleicher Signatur überschrieben werden können Erst zur Laufzeit wird bestimmt welche Variante verwendet wird (dynamisches Binden) Sofern vorhanden wird die Implementierung der Unterklasse verwendet Wenn eine Unterklasse eine virtuelle Methode einer Basisklasse nicht überschreibt wird die Methode der Basisklasse genutzt Klassen mit virtuellen Methoden werden als polymorphe Klassen bezeichnet
MÜNSTER Übung zur Vorlesung Wissenschaftliches Rechnen SS 2012 20 /22 Abstrakte Methoden Abstrakte Klassen Abstrakte Methoden (rein virtuelle Methoden) sind virtuelle Methoden die keine Implementierung besitzen
MÜNSTER Übung zur Vorlesung Wissenschaftliches Rechnen SS 2012 20 /22 Abstrakte Methoden Abstrakte Klassen Abstrakte Methoden (rein virtuelle Methoden) sind virtuelle Methoden die keine Implementierung besitzen Sie bestehen nur aus ihrer Deklaration in Form eines Prototyps z.b. virtual void pure_virtual () = 0; Die Implementierung erfolgt erst in den abgeleiteten Klassen weshalb eine Klasse mit abstrakten Methoden auch nicht direkt instanziiert werden kann
MÜNSTER Übung zur Vorlesung Wissenschaftliches Rechnen SS 2012 20 /22 Abstrakte Methoden Abstrakte Klassen Abstrakte Methoden (rein virtuelle Methoden) sind virtuelle Methoden die keine Implementierung besitzen Sie bestehen nur aus ihrer Deklaration in Form eines Prototyps z.b. virtual void pure_virtual () = 0; Die Implementierung erfolgt erst in den abgeleiteten Klassen weshalb eine Klasse mit abstrakten Methoden auch nicht direkt instanziiert werden kann Enthält eine Klasse eine abstrakte Methode wird sie als abstrakte Klasse bezeichnet
MÜNSTER Übung zur Vorlesung Wissenschaftliches Rechnen SS 2012 20 /22 Abstrakte Methoden Abstrakte Klassen Abstrakte Methoden (rein virtuelle Methoden) sind virtuelle Methoden die keine Implementierung besitzen Sie bestehen nur aus ihrer Deklaration in Form eines Prototyps z.b. virtual void pure_virtual () = 0; Die Implementierung erfolgt erst in den abgeleiteten Klassen weshalb eine Klasse mit abstrakten Methoden auch nicht direkt instanziiert werden kann Enthält eine Klasse eine abstrakte Methode wird sie als abstrakte Klasse bezeichnet Hinweis: Die Abstraktheit einer Methode darf sich über mehrere Ebenen der Vererbungshierarchie erstrecken
Interfaces MÜNSTER Übung zur Vorlesung Wissenschaftliches Rechnen SS 2012 21 /22 Die Gemeinsamkeiten von Klassen sollen häufig von einer Schnittstelle abgebildet werden Die verschiedenen Klassen können verschiedene Implementierungen der Schnittstelle verwenden
Interfaces MÜNSTER Übung zur Vorlesung Wissenschaftliches Rechnen SS 2012 21 /22 Die Gemeinsamkeiten von Klassen sollen häufig von einer Schnittstelle abgebildet werden Die verschiedenen Klassen können verschiedene Implementierungen der Schnittstelle verwenden Solche Schnittstellen werden auch Interfaces genannt
Interfaces MÜNSTER Übung zur Vorlesung Wissenschaftliches Rechnen SS 2012 21 /22 Die Gemeinsamkeiten von Klassen sollen häufig von einer Schnittstelle abgebildet werden Die verschiedenen Klassen können verschiedene Implementierungen der Schnittstelle verwenden Solche Schnittstellen werden auch Interfaces genannt In C++ realisiert man ein Interface als abstrakte Klasse die ausschließlich aus abstrakten Methoden besteht
MÜNSTER Übung zur Vorlesung Wissenschaftliches Rechnen SS 2012 22 /22 Beispiel Interfaces c l a s s G e o m e t r i e O b j e k t I n t e r f a c e { 2 public : v i r t u a l double umfang ( ) = 0; 4 v i r t u a l double f l a e c h e ( ) = 0; } ; 6 c l a s s K r e i s : G e o m e t r i e O b j e k t I n t e r f a c e { 8 double radius ;... 10 v i r t u a l double umfang ( ) { return 2 M_PI radius ; } v i r t u a l double flaeche ( ) { return M_PI radius radius ; } 12 } ; 14 c l a s s Rechteck : G e o m e t r i e O b j e k t I n t e r f a c e { double hoehe ; double breite ; 16... v i r t u a l double umfang ( ) { return 2 hoehe breite ; } 18 v i r t u a l double flaeche ( ) { return hoehe breite ; } } ; 20 void datenausgeben ( G e o m e t r i e O b j e k t I n t e r f a c e& geom ) { 22 std : : cout < < "Umfang = " < < geom. umfang ( ) < < " Flaeche = " < < geom. f l a e c h e ( ) < < std : : endl ; 24 } 26 i n t main ( ) { K r e i s k ( 3. 0 ) ; Rechteck r ( 3. 5 4. 2 ) ; 28 datenausgeben ( k ) ; datenausgeben ( r ) ; }