29
Universität Bielefeld Neuroinformatics Group, CITEC Praxisorientierte Einf¨ uhrung in C++ Lektion: ”Mehrfachvererbung” Christof Elbrechter, Florian P. Schmidt Neuroinformatics Group, CITEC April 5, 2011 Christof Elbrechter Praxisorientierte Einf¨ uhrung in C++ April 5, 2011 1 / 29

Praxisorientierte Einführung in C++ Lektion ... · Universität Bielefeld Neuroinformatics Group, CITEC Table of Contents Allgemeines Mehrfachvererbung Mehrfachvererbug - Namensau

  • Upload
    tranthu

  • View
    219

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Praxisorientierte Einführung in C++ Lektion ... · Universität Bielefeld Neuroinformatics Group, CITEC Table of Contents Allgemeines Mehrfachvererbung Mehrfachvererbug - Namensau

Universität Bielefeld Neuroinformatics Group, CITEC

Praxisorientierte Einfuhrung in C++Lektion: ”Mehrfachvererbung”

Christof Elbrechter, Florian P. Schmidt

Neuroinformatics Group, CITEC

April 5, 2011

Christof Elbrechter Praxisorientierte Einfuhrung in C++ April 5, 2011 1 / 29

Page 2: Praxisorientierte Einführung in C++ Lektion ... · Universität Bielefeld Neuroinformatics Group, CITEC Table of Contents Allgemeines Mehrfachvererbung Mehrfachvererbug - Namensau

Universität Bielefeld Neuroinformatics Group, CITEC

Table of Contents

◦ Allgemeines

◦ Mehrfachvererbung

◦ Mehrfachvererbug - Namensauflosung

◦ Konstruktoren und Destruktoren

◦ Virtuelle Vererbung

◦ Virtuelle Vererbung - Die Losung

◦ Virtuelle Vererbung - Warum so kompliziert?

◦ Aggregation oder Vererbung?

Christof Elbrechter Praxisorientierte Einfuhrung in C++ April 5, 2011 2 / 29

Page 3: Praxisorientierte Einführung in C++ Lektion ... · Universität Bielefeld Neuroinformatics Group, CITEC Table of Contents Allgemeines Mehrfachvererbung Mehrfachvererbug - Namensau

Universität Bielefeld Neuroinformatics Group, CITEC Allgemeines

Motivation

• Bis jetzt: Klasse hat keine oder eine Oberklasse

• C++ erlaubt auch, mehr als eine Klasse/Struktur zu beerben

• Syntax ahnlich wie Initialisierungsliste

struct EierlegendeWollmilchSau :

public Huhn , // wichtig: Vererbungs -

public Rind , // Qualifier bindet nur an

public Schwein , // das naechste Token

public Schaf

{

};

Christof Elbrechter Praxisorientierte Einfuhrung in C++ April 5, 2011 3 / 29

Page 4: Praxisorientierte Einführung in C++ Lektion ... · Universität Bielefeld Neuroinformatics Group, CITEC Table of Contents Allgemeines Mehrfachvererbung Mehrfachvererbug - Namensau

Universität Bielefeld Neuroinformatics Group, CITEC Allgemeines

Motivation

• Wir modellieren Eigenschaften als Klassenhierarchien

• Beispiel:

• Apparat• Motorgetrieben• Windgetrieben

• Organismus• Pflanze• Tier

• Klasse Auto kann z.B. Motorgetrieben beerben

• Klasse Mensch beerbt Klasse Tier

• Aber was ist mit einer Klasse Cyborg?• Ein Cyborg ist ein Apparat und ein Organismus

Christof Elbrechter Praxisorientierte Einfuhrung in C++ April 5, 2011 4 / 29

Page 5: Praxisorientierte Einführung in C++ Lektion ... · Universität Bielefeld Neuroinformatics Group, CITEC Table of Contents Allgemeines Mehrfachvererbung Mehrfachvererbug - Namensau

Universität Bielefeld Neuroinformatics Group, CITEC Allgemeines

Motivation

• Losung: Klasse Cyborg erbt von Apparat und Organismus

Christof Elbrechter Praxisorientierte Einfuhrung in C++ April 5, 2011 5 / 29

Page 6: Praxisorientierte Einführung in C++ Lektion ... · Universität Bielefeld Neuroinformatics Group, CITEC Table of Contents Allgemeines Mehrfachvererbung Mehrfachvererbug - Namensau

Universität Bielefeld Neuroinformatics Group, CITEC Mehrfachvererbung

Mehrfachvererbung

struct Organism {

virtual ~Organism () { }

virtual void live() = 0;

};

struct Apparatus {

virtual ~Apparatus () { }

virtual void operate () = 0;

};

struct Cyborg : public Organism , public Apparatus {

virtual void live() {

// do the cyborg organism thang

}

virtual void operate () {

// do the cyborg apparatus thang

}

};

Christof Elbrechter Praxisorientierte Einfuhrung in C++ April 5, 2011 6 / 29

Page 7: Praxisorientierte Einführung in C++ Lektion ... · Universität Bielefeld Neuroinformatics Group, CITEC Table of Contents Allgemeines Mehrfachvererbung Mehrfachvererbug - Namensau

Universität Bielefeld Neuroinformatics Group, CITEC Mehrfachvererbung

Mehrfachvererbung

• Klasse Cyborg gehorcht jetzt den Schnittstellen von Apparatus

und Organism

• Polymorphismus funktioniert mit Referenzen/Zeigern aufApparatus und Organism

• Dabei kann immer nur auf einen Aspekt des Objekts zugegriffenwerden...

Christof Elbrechter Praxisorientierte Einfuhrung in C++ April 5, 2011 7 / 29

Page 8: Praxisorientierte Einführung in C++ Lektion ... · Universität Bielefeld Neuroinformatics Group, CITEC Table of Contents Allgemeines Mehrfachvererbung Mehrfachvererbug - Namensau

Universität Bielefeld Neuroinformatics Group, CITEC Mehrfachvererbung

Mehrfachvererbung

• Beispiel: Zugriff uber Organism- oder Apparatus-Referenz

void age(Organism &o) {

o.live() // Zugriff auf Organism -Aspekte von o

}

void wear(Apparatus &a) {

a.operate () // Zugriff auf Apparatus -Aspekte von a

}

int main() {

Cyborg c;

age(c);

wear(c);

}

Christof Elbrechter Praxisorientierte Einfuhrung in C++ April 5, 2011 8 / 29

Page 9: Praxisorientierte Einführung in C++ Lektion ... · Universität Bielefeld Neuroinformatics Group, CITEC Table of Contents Allgemeines Mehrfachvererbung Mehrfachvererbug - Namensau

Universität Bielefeld Neuroinformatics Group, CITEC Mehrfachvererbug - Namensauflosung

Namensauflosung

• Was ist, wenn Basisklassen gemeinsamen Bezeichner haben?

• Ausdrucke sind nicht mehr eindeutig

struct Organism { string name; float getAge (){} };

struct Apparatus { string name; float getAge (){} };

struct Cyborg : public Organism , public Apparatus { };

int main() {

Cyborg c;

c.name = "Christof"; // Fehler: nicht eindeutig

c.getAge (); // ditto

}

Christof Elbrechter Praxisorientierte Einfuhrung in C++ April 5, 2011 9 / 29

Page 10: Praxisorientierte Einführung in C++ Lektion ... · Universität Bielefeld Neuroinformatics Group, CITEC Table of Contents Allgemeines Mehrfachvererbung Mehrfachvererbug - Namensau

Universität Bielefeld Neuroinformatics Group, CITEC Mehrfachvererbug - Namensauflosung

Namensauflosung

• Losung, die ”immer funktioniert”:• In Ausdrucken: Explizite Nennung des ”Slices”• Basisklassen-Prafix vor Bezeichner bei Aufruf der

Methode/Benutzung der Elementvariable im Ausdruck...

struct Organism { string name; float getAge (){} };

struct Apparatus { string name; float getAge (){} };

struct Cyborg : public Organism , public Apparatus { };

int main() {

Cyborg c;

c.Organism ::name = "Christof";

float age = c.Apparatus :: getAge ();

}

Christof Elbrechter Praxisorientierte Einfuhrung in C++ April 5, 2011 10 / 29

Page 11: Praxisorientierte Einführung in C++ Lektion ... · Universität Bielefeld Neuroinformatics Group, CITEC Table of Contents Allgemeines Mehrfachvererbung Mehrfachvererbug - Namensau

Universität Bielefeld Neuroinformatics Group, CITEC Mehrfachvererbug - Namensauflosung

Namesauflosung - Alternative

• Bei Methoden Alternative: Explizites Uberschreiben oder”Importieren” von Methoden aus Basisklasse...

• ...in vielen Fallen muss dann aber was anderes passieren:• Reimplementation der entsprechenden Funktion

struct Organism { string name; float getAge (){} };

struct Apparatus { string name; float getAge (){} };

struct Cyborg : public Organism , public Apparatus {

Organism :: getAge;

};

int main() {

Cyborg c;

float age = c.getAge (); // eindeutig

}

Christof Elbrechter Praxisorientierte Einfuhrung in C++ April 5, 2011 11 / 29

Page 12: Praxisorientierte Einführung in C++ Lektion ... · Universität Bielefeld Neuroinformatics Group, CITEC Table of Contents Allgemeines Mehrfachvererbung Mehrfachvererbug - Namensau

Universität Bielefeld Neuroinformatics Group, CITEC Mehrfachvererbug - Namensauflosung

Namensauflosung - Elementvariablen

• Leider funktioniert das nicht mit Elementvariablen

• D.h.: Elemente in Basisklassen protected (oder private)machen und Zugriff uber (virtuelle) Methoden regeln

• Entspricht auch eher dem Prinzip des ”Information Hiding”

Christof Elbrechter Praxisorientierte Einfuhrung in C++ April 5, 2011 12 / 29

Page 13: Praxisorientierte Einführung in C++ Lektion ... · Universität Bielefeld Neuroinformatics Group, CITEC Table of Contents Allgemeines Mehrfachvererbung Mehrfachvererbug - Namensau

Universität Bielefeld Neuroinformatics Group, CITEC Mehrfachvererbug - Namensauflosung

Mehrfachvererbung - Anmerkung

• Gleiche Bezeichner in Basisklassen manchmal auch Hinweis aufmogliche Modellierung mit gemeinsamer Basisklasse

• Diamantformiger Vererbungsgraph• ”Virtuelle” Vererbung (spater)

Christof Elbrechter Praxisorientierte Einfuhrung in C++ April 5, 2011 13 / 29

Page 14: Praxisorientierte Einführung in C++ Lektion ... · Universität Bielefeld Neuroinformatics Group, CITEC Table of Contents Allgemeines Mehrfachvererbung Mehrfachvererbug - Namensau

Universität Bielefeld Neuroinformatics Group, CITEC Konstruktoren und Destruktoren

Konstruktoren

• Bei Einfachvererbung:• Konstruktor der Basisklasse wird vor Konstruktor der abgeleiteten

Klasse aufgerufen (rekursiv)• Welcher? Initialisierungsliste!

• Bei Mehrfachvererbung:• Konstruktoren der Basisklassen werden vor Konstruktor der

abgeleiteten Klasse aufgerufen• Reihenfolge, wie in der Vererbungsliste• Initialisierungsliste des Konstruktors kann spezielle

Konstruktoraufrufe fur Basisklassen enthalten

Christof Elbrechter Praxisorientierte Einfuhrung in C++ April 5, 2011 14 / 29

Page 15: Praxisorientierte Einführung in C++ Lektion ... · Universität Bielefeld Neuroinformatics Group, CITEC Table of Contents Allgemeines Mehrfachvererbung Mehrfachvererbug - Namensau

Universität Bielefeld Neuroinformatics Group, CITEC Konstruktoren und Destruktoren

Konstruktoren - Beispiel

struct Organism {

Organism(const DNA &dna) { ... }

Organism () { ... }

};

struct Apparatus {

Apparatus(const Schematic &schematic) { ... }

Apparatus () { ... }

};

struct Cyborg : public Organism , public Apparatus {

Cyborg () { ... }

Cyborg(const DNA &dna) : Organism(d) { ... }

Cyborg(const Schematic &s) : Apparatus(s)

{ ... }

Cyborg(const Schematic &s, const DNA &d) :

Apparatus(s), Organism(d)

{ ... }

};

Christof Elbrechter Praxisorientierte Einfuhrung in C++ April 5, 2011 15 / 29

Page 16: Praxisorientierte Einführung in C++ Lektion ... · Universität Bielefeld Neuroinformatics Group, CITEC Table of Contents Allgemeines Mehrfachvererbung Mehrfachvererbug - Namensau

Universität Bielefeld Neuroinformatics Group, CITEC Konstruktoren und Destruktoren

Destruktoren

• Destruktoren werden in umgekehrter Reihenfolge aufgerufen(umgekehrt zu der Reihenfolge in der Vererbungsliste)

Christof Elbrechter Praxisorientierte Einfuhrung in C++ April 5, 2011 16 / 29

Page 17: Praxisorientierte Einführung in C++ Lektion ... · Universität Bielefeld Neuroinformatics Group, CITEC Table of Contents Allgemeines Mehrfachvererbung Mehrfachvererbug - Namensau

Universität Bielefeld Neuroinformatics Group, CITEC Virtuelle Vererbung

Virtuelle Vererbung - Motivation

• Beispiel: Modellierung von Fahrzeugtypen

• Gemeinsame Oberklasse Fahrzeug

• Einteilung in• Landfahrzeug• Wasserfahrzeug• Luftfahrzeug

Christof Elbrechter Praxisorientierte Einfuhrung in C++ April 5, 2011 17 / 29

Page 18: Praxisorientierte Einführung in C++ Lektion ... · Universität Bielefeld Neuroinformatics Group, CITEC Table of Contents Allgemeines Mehrfachvererbung Mehrfachvererbug - Namensau

Universität Bielefeld Neuroinformatics Group, CITEC Virtuelle Vererbung

Virtuelle Vererbung - Motivation

• Ein spezielles Fahrzeug beerbt eine dieser Klassen

• Beispiele fur abgeleitete Klassen• Auto• Fahrrad• Motorboot• Segelboot• Segelflugzeug• etc..

• Aber was ist mit einem Amphibien-fahrzeug?• Amphibienfahrzeug erbt von Landfahrzeug und Wasserfahrzeug

Christof Elbrechter Praxisorientierte Einfuhrung in C++ April 5, 2011 18 / 29

Page 19: Praxisorientierte Einführung in C++ Lektion ... · Universität Bielefeld Neuroinformatics Group, CITEC Table of Contents Allgemeines Mehrfachvererbung Mehrfachvererbug - Namensau

Universität Bielefeld Neuroinformatics Group, CITEC Virtuelle Vererbung

Virtuelle Vererbung - Motivation - Beispiel

struct Fahrzeug {

float m_posX , m_posY;

virtual void fahrNach(float x, float y) {

m_posX = x; m_posY = y;

}

virtual float maxGeschwindigkeit () = 0;

virtual ~Fahrzeug () { }

};

struct LandFahrzeug : public Fahrzeug {

virtual float maxSteigung () = 0;

};

struct WasserFahrzeug : public Fahrzeug {

virtual float maxWindStaerke () = 0;

virtual float minWasserTiefe () = 0;

};

struct LuftFahrzeug : public Fahrzeug {

virtual float maxHoehe () = 0;

};

Christof Elbrechter Praxisorientierte Einfuhrung in C++ April 5, 2011 19 / 29

Page 20: Praxisorientierte Einführung in C++ Lektion ... · Universität Bielefeld Neuroinformatics Group, CITEC Table of Contents Allgemeines Mehrfachvererbung Mehrfachvererbug - Namensau

Universität Bielefeld Neuroinformatics Group, CITEC Virtuelle Vererbung

Virtuelle Vererbung - Motivation - Beispiel

• Eine spezielle Klasse, z.B. Maserati erbt von einer dieser Klassen,und implementiert ggf. Methoden

struct Maserati : public Landfahrzeug {

virtual float maxSteigung () { return 30; }

virtual float maxGeschwindigkeit () { return 1000; }

};

• Bis hierhin ist alles gut :D

Christof Elbrechter Praxisorientierte Einfuhrung in C++ April 5, 2011 20 / 29

Page 21: Praxisorientierte Einführung in C++ Lektion ... · Universität Bielefeld Neuroinformatics Group, CITEC Table of Contents Allgemeines Mehrfachvererbung Mehrfachvererbug - Namensau

Universität Bielefeld Neuroinformatics Group, CITEC Virtuelle Vererbung

Virtuelle Vererbung - Motivation

• VW Typ 166 ist ein Amphibienfahrzeug, ist also Land- undWasserfahrzeug

• Klasse VWTyp166 erbt also von beiden Klassen

• Quelle: http://de.wikipedia.org/wiki/Bild:

VW_Schwimmwagen_1.jpg

Christof Elbrechter Praxisorientierte Einfuhrung in C++ April 5, 2011 21 / 29

Page 22: Praxisorientierte Einführung in C++ Lektion ... · Universität Bielefeld Neuroinformatics Group, CITEC Table of Contents Allgemeines Mehrfachvererbung Mehrfachvererbug - Namensau

Universität Bielefeld Neuroinformatics Group, CITEC Virtuelle Vererbung

Virtuelle Vererbung - Motivation

struct VWTyp166 :

public LandFahrzeug ,

public WasserFahrzeug

{

virtual float maxSteigung () { return 20; }

virtual float maxGeschwindigkeit () { return 100; }

virtual float maxWindStaerke () { return 6.5; }

virtual float minWasserTiefe () { return 0; }

};

• Klasse VWTyp166 erbt somit alle Methoden und Elemente allerElternklassen

• Soweit, so gut, aber was ist mit m_posX und m_posY? Oder mitfahrNach()

• Die gibt es jetzt zweimal

VWTyp166 superTeil;

superTeil.fahrNach (0,0); // Fehler. Aufruf ist mehrdeutig :(

Christof Elbrechter Praxisorientierte Einfuhrung in C++ April 5, 2011 22 / 29

Page 23: Praxisorientierte Einführung in C++ Lektion ... · Universität Bielefeld Neuroinformatics Group, CITEC Table of Contents Allgemeines Mehrfachvererbung Mehrfachvererbug - Namensau

Universität Bielefeld Neuroinformatics Group, CITEC Virtuelle Vererbung

Virtuelle Vererbung - Explizite Nennung

• Explizites Prafix auch hier moglich

VWTyp166 superTeil;

superTeil.LandFahrzeug :: fahrNach (0,0);

superTeil.WasserFahrzeug :: fahrNach (1,1);

• Allerdings nicht immer sinnvoll• Gespaltene Personlichkeit!

Christof Elbrechter Praxisorientierte Einfuhrung in C++ April 5, 2011 23 / 29

Page 24: Praxisorientierte Einführung in C++ Lektion ... · Universität Bielefeld Neuroinformatics Group, CITEC Table of Contents Allgemeines Mehrfachvererbung Mehrfachvererbug - Namensau

Universität Bielefeld Neuroinformatics Group, CITEC Virtuelle Vererbung - Die Losung

Virtuelle Vererbung - Die Losung

• Losung: virtuelle Vererbung

• Schlusselwort virtual (noch mal)

• Bewirkt, dass in abgeleiteten Klassen die virtuell beerbte Klasse nureinmal vorkommt

• Im Beispiel: LuftFahrzeug, WasserFahrzeug und LandFahrzeug

sollten Fahrzeug virtuell beerben

Christof Elbrechter Praxisorientierte Einfuhrung in C++ April 5, 2011 24 / 29

Page 25: Praxisorientierte Einführung in C++ Lektion ... · Universität Bielefeld Neuroinformatics Group, CITEC Table of Contents Allgemeines Mehrfachvererbung Mehrfachvererbug - Namensau

Universität Bielefeld Neuroinformatics Group, CITEC Virtuelle Vererbung - Die Losung

Virtuelle Vererbung - Beispiel

struct Fahrzeug {

float m_posX , m_posY;

virtual void fahrNach(float x, float y) {

m_posX = x; m_posY = y;

}

virtual float maxGeschwindigkeit () = 0;

virtual ~Fahrzeug () { }

};

struct LandFahrzeug : public virtual Fahrzeug {

virtual float maxSteigung () = 0;

};

struct WasserFahrzeug : public virtual Fahrzeug {

virtual float maxWindStaerke () = 0;

virtual float minWasserTiefe () = 0;

};

struct LuftFahrzeug : public virtual Fahrzeug {

virtual float maxHoehe () = 0;

};

Christof Elbrechter Praxisorientierte Einfuhrung in C++ April 5, 2011 25 / 29

Page 26: Praxisorientierte Einführung in C++ Lektion ... · Universität Bielefeld Neuroinformatics Group, CITEC Table of Contents Allgemeines Mehrfachvererbung Mehrfachvererbug - Namensau

Universität Bielefeld Neuroinformatics Group, CITEC Virtuelle Vererbung - Die Losung

Virtuelle Vererbung - Beispiel

• Jetzt geht’s

struct VWTyp166 :

public LandFahrzeug ,

public WasserFahrzeug

{

virtual float maxSteigung () { return 20; }

virtual float maxGeschwindigkeit () { return 100; }

virtual float maxWindStaerke () { return 6.5; }

virtual float minWasserTiefe () { return 0; }

};

VWTyp166 superTeil;

superTeil.fahrNach (0,0);

Christof Elbrechter Praxisorientierte Einfuhrung in C++ April 5, 2011 26 / 29

Page 27: Praxisorientierte Einführung in C++ Lektion ... · Universität Bielefeld Neuroinformatics Group, CITEC Table of Contents Allgemeines Mehrfachvererbung Mehrfachvererbug - Namensau

Universität Bielefeld Neuroinformatics Group, CITEC Virtuelle Vererbung - Warum so kompliziert?

Warum so kompliziert?

• Warum so kompliziert?

• Es macht manchmal auch Sinn, Vererbung fur Aggregation zunutzen. Dann braucht man evtl. zwei identische Slices dergemeinsamen Basisklasse

• Faustregel: Wenn Mehrfachvererbung fur Modellierung von”ist-ein”-Beziehungen moglich sein soll: virtuelle Vererbung vonallen gemeinsamen Basisklassen

Christof Elbrechter Praxisorientierte Einfuhrung in C++ April 5, 2011 27 / 29

Page 28: Praxisorientierte Einführung in C++ Lektion ... · Universität Bielefeld Neuroinformatics Group, CITEC Table of Contents Allgemeines Mehrfachvererbung Mehrfachvererbug - Namensau

Universität Bielefeld Neuroinformatics Group, CITEC Aggregation oder Vererbung?

Aggregation oder Vererbung?

• Manchmal macht Aggregation mehr Sinn als Mehrfachvererbung

• Fahrzeug (LuftFahrzeug, LandFahrzeug, Wasserfahrzeug)

• Maschine

(LuftGetrieben, Oelgetrieben, Muskelkfraftgetrieben)

• Alle Kombinationen explizit als Klassen modellieren: 3 * 3 = 9Moglichkeiten

Christof Elbrechter Praxisorientierte Einfuhrung in C++ April 5, 2011 28 / 29

Page 29: Praxisorientierte Einführung in C++ Lektion ... · Universität Bielefeld Neuroinformatics Group, CITEC Table of Contents Allgemeines Mehrfachvererbung Mehrfachvererbug - Namensau

Universität Bielefeld Neuroinformatics Group, CITEC Aggregation oder Vererbung?

Aggregation oder Vererbung

• Alternative: Durch Aggregation modellieren:

struct Fahrzeug {

Maschine *m_maschine;

};

struct WasserFahrzeug : public Fahrzeug {

};

int main() {

WasserFahrzeug ruderBoot;

ruderBoot.m_maschine = new MuskelkraftMaschine ();

}

• Dadurch nur noch 3 + 3 = 6 Klassen explizit zu modellieren• Verlust von feiner Kontrolle uber Verhalten

• In diesem Fall aber vielleicht naher an der menschlichenWahrnehmung

Christof Elbrechter Praxisorientierte Einfuhrung in C++ April 5, 2011 29 / 29