Einführung in C++
Einführung in C++
Vererbung I Vererbung I
●
Durch Vererbung können aus bereits bestehenden Klassen neue Klassen konstruiert werden.
●
Die neue abgeleitete Klasse „erbt“ dabei die Daten und Methoden der sog. Basisklasse.
●
Sie kann zusätzlich um weitere Methoden oder Attribute erweitert werden.
Eigenschaften und Methoden der Klasse Kfz
Kfz
Pkw
Eigenschaften und Methoden der Klasse Kfz Zusätzliche Eigenschaften und Methoden der Klasse Pkw
Lkw
Eigenschaften und
Methoden der Klasse Kfz
Zusätzliche Eigenschaften und
Methoden der Klasse Lkw
Vererbung II Vererbung II
●
Definition einer abgeleiteten Klasse:
●
Alle public-Elemente der Basisklasse B werden damit auch in der abgeleiteten Klasse C verfügbar gemacht.
●
Auch eine Methode der abgeleiteten Klasse kann nicht auf die privaten Elemente der Basisklasse zugreifen.
class C : public B { private:
// Deklaration der zusätzlichen
// privaten Datenelemente und Methoden public:
// Deklaration der zusätzlichen
// öffentlichen Datenelemente und Methoden
};
Vererbung III Vererbung III
●
Eine abgeleitete Klasse kann selbst wieder Basisklasse werden. Damit sind Vererbungshierarchien möglich.
Basisklasse A
B A ist direkte Basisklasse A
A ist indirekte Basisklasse
C
Polymorphie I Polymorphie I
●
Polymorphie bedeutet „Vielgestaltigkeit“
●
In C++ wird dies mit Hilfe von virtuellen Methoden und Zeigern (Referenzen) erreicht.
●
Ein Zeiger vom Typ der Basisklasse kann verwendet werden, um die überschriebene (redefinierte)
Instanzmethode einer abgeleiteten Klasse aufzurufen.
Die passende Zuordnung zwischen Zeiger und
passender Methode erfolgt zur Laufzeit (späte Bindung)
Polymorphie II Polymorphie II
●
Die Basisklasse Kfz speichert Daten, welche für beide Kfz-Typen relevant sind.
●
Die abgeleiteten Klassen Pkw und Lkw erben diese Daten.
●
Ein Objekt der Klasse Pkw oder Lkw speichern nur die
zusätzlichen Typrelevanten Daten.
Polymorphie III Polymorphie III
●
Da die Methode ZeigeDaten() soll nur die Daten des
betreffenden Typs ausgeben. Sie wird in der Basisklasse als virtuell deklariert.
Und in den abgeleiteten Klassen redefiniert.
●
Die Basisklasse Kfz speichert Daten, welche für beide Kfz-Typen relevant sind.
●
Die abgeleiteten Klassen Pkw und Lkw speichern nur die zusätzlichen Typrelevanten Daten.
virtual void ZeigeDaten();
// pkw.C // in Lkw.C
void pkw::ZeigeDaten() { void Lkw::ZeigeDaten() {
Kfz::ZeigeDaten(); Kfz::ZeigeDaten();
if(elFensterheber) cout << „ja“; cout << Gewicht;
else cout << „nein“; cout << Zuladung;
} }
Polymorphie IV Polymorphie IV
●
Obwohl die Instanzen dieser Klasse nun
unterschiedliche Ausprägungen haben, können sie in einem gemeinsamen Vektor zusammengefasst werden.
●
Dazu wird ein Vektor aus Zeigern der Basisklasse Kfz gebildet und initialisiert. Anschließend können die
Datensätze aufgenommen werden.
Kfz** datenBank = new Kfz[Anz];
for(int i=0; i<Anz; i++) { dantenBank[i] = 0;
datenBank[0] = new Pkw(„VW“, true);
datenBank[1] = new Lkw(„MAN“, 38000, 34000);
Polymorphie V Polymorphie V
●
Obwohl die Pkw und Lkw Datentypen nun „gemischt“
im Vektor gespeichert wurden, kann nun – dank Polymorphie – den Vektor durchlaufen:
●
Nun wird automatisch die jeweils passende Methode ZeigeDaten() aufgerufen, und die entsprechenden Typrelevanten Daten ausgegeben.
for(int i=0; i<anz; i++) {
datenBank[i] > ZeigeDaten();
Hersteller: VW
elektrFensterheber: ja
Hersteller: MAN
Gesamtgewicht: 38000 kg
Zuladung: 34000 kg
Typsichere Konvertierung Typsichere Konvertierung
<sstream>
<sstream>
●
Stringstreams eignen sich zur Konver-
tierung unterschiedlicher Datenformate.
–
Beispiel 1:
#include <sstream>
#include <string>
using namespace std;
...
double d;
string s = „3,14159265“; //
stringstream str; // anlegen eins „stringStreams“
str << s; // zwischenspeichern des Strings str >> d; // Ausgabe nach d:
// da der Typ von d festgelegt ist,
// wird der String automatisch in eine
// double konvertiert.
Typsichere Konvertierung Typsichere Konvertierung
<sstream> II
<sstream> II
●