• Keine Ergebnisse gefunden

Einführung in C++ Einführung in C++

N/A
N/A
Protected

Academic year: 2021

Aktie "Einführung in C++ Einführung in C++"

Copied!
11
0
0

Wird geladen.... (Jetzt Volltext ansehen)

Volltext

(1)

Einführung in C++

Einführung in C++

(2)

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

(3)

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

};

(4)

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

(5)

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)

(6)

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.

(7)

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;

} }

(8)

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);

(9)

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

(10)

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 „string­Streams“

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.

(11)

Typsichere Konvertierung Typsichere Konvertierung

<sstream> II

<sstream> II

Beispiel 2: Eingabe/Konvertierung verschiedener Datentypen

#include <sstream>

#include <string>

#include <iostream>

using namespace std;

...

int i=0; string s=""; double d=0; string z="";

char* msg[] = {"Integer", "Wort", "Double", "Zeile"};

string line;

for(int j=0; j<4; ++j) {

cout << "Bitte einen " << msg[j] << " eingeben: ";

if (!getline(cin, line)) return 1;

istringstream is(line);

switch (j) {

case 0: is >> i; break;

case 1: is >> s; break;

case 2: is >> d; break;

case 3: z = line; break;

}

if(!is) j­­;

}

Referenzen

ÄHNLICHE DOKUMENTE

– Funktionstemplate legt die Anweisung einer Funktion fest, wobei statt eines konkreten Typs ein Parameter eingesetzt wird.. – Klassentemplates legt Definition einer Klasse fest,

Sie werden dazu verwendet, eine Aktion auf alle Elemente eines Containers anzuwenden. – Algorithmen bestehen aus Routinen, die alle auf Containern

Die Schlüsselwörter werden im Klartext in einer Datei gespeichert und von einem Übersetzungsprogramm (Compiler) in Maschinensprache umge- wandelt.. • Wir benutzen als C++

• dient nur als Schablone für abgeleitete Klassen I abstrakte Klassen können nicht instanziert werden. • Compiler

friend class Freundklasse; //Freundklasse hat jetzt Zugriff //auf private-Elemente der Klasse testklasse private:...}.

Anmerkung: Man hätte die Liste gleich in richtiger Folge Man hätte die Liste gleich in richtiger Folge aufbauen oder nachträglich umordnen können. Dann wäre aufbauen

[r]

Rückgabetypen Name (Eingabetypen mit Parameternamen) {Body}..