1 / 90

Vererbung

Vererbung. Das Prinzip der Vererbung im täglichen Leben:. Walter besitzt ein Haus. Walter erbt nun 10000Euro. Also besitzt er insgesamt:. +. 10000. Erblasser. Erbe. In C++:. --->. In C++ darf man einen Erben (abgeleitete Klasse) selbst basteln. abgeleitete Klasse. Basisklasse.

edward
Télécharger la présentation

Vererbung

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Vererbung

  2. Das Prinzip der Vererbung im täglichen Leben:

  3. Walter besitzt ein Haus.

  4. Walter erbt nun 10000Euro. Also besitzt er insgesamt: + 10000

  5. Erblasser Erbe In C++: ---> In C++ darf man einen Erben (abgeleitete Klasse) selbst basteln abgeleitete Klasse Basisklasse --->

  6. Statt Basisklasse sagt man auch:Oberklasse, Vaterklasse

  7. Statt abgeleiteter Klasse sagt man auch:Unterklasse, Sohnklasse, Subklasse

  8. Eine abgeleiteteKlasse wird in C++ wie folgt angegeben: class Ei:publicHuhn{ ... } wird getrennt durch Doppelpunkt Zugriffsart Basisklasse abgeleitete Klasse

  9. Die abgeleitete Klasse (kurz: Ableitung) besitzt automatisch alle Member (Ausnahme: Konstruktor) der Basisklasse.

  10. Beispiel:

  11. Von einem Flachdachhaus wird ein Modell (Draufsicht) erstellt:

  12. Der Einfachheit halber wird nur die Grundfläche (ohne Zimmer, usw.) des Hauses abgebildet.Aufgabe:Realsieren Sie die Klasse Modell in C++.

  13. class Modell{ private: double l; double b; public: Modell(double ll, double bb); void setL(double ll); void setB(double bb); double getL(); double getB(); double getFlaeche(); }

  14. Modell::Modell(double ll, double bb){ l = ll; b = bb; } void Modell::setL(double ll){ l = ll; } void Modell::setB(double bb){ b = bb; }

  15. double Modell::getL(){ return(l); } double Modell::getB(){ return(b); } double Modell::getFlaeche(){ return(l*b); }

  16. Jetzt soll ein “genaueres“ Modell des Flachdachhauses erstellt werden: Modell aus Styropor (oder Ton). Aufgabe:Realsieren Sie in C++ die Klasse Gmodell.

  17. Wie kann man sich dabei Schreibarbeit sparen ? Wie kann man Softwareteile dabei wiederverwenden ? Indem man die Vererbung benutzt.

  18. Welche Member der Klasse Modell kann man übernehmen (erben) ?Welche Member kommen neu dazu ?

  19. class Modell{ private: double l; double b; public: Modell(double ll, double bb); void setL(double ll); void setB(double bb); double getL(); double getB(); double getFlaeche(); } Alle außer dem Konstruktor Welche Member werden vererbt ? Welche Member müssen neu dazu ?

  20. :public Modell class Gmodell { private: double l; double b; public: void setL(double ll); void setB(double bb); double getL(); double getB(); double getFlaeche(); } Die reliefförmig dargestellten Member werden geerbt. double h; Gmodell(double ll, double bb, double hh); Wie wird eine Vererbung erreicht ? void setH(double hh); Die rot dargestellten Member kommen neu dazu. double getH(); double getVolumen();

  21. Also sieht die Klasse folgendermassen aus:

  22. class Gmodell:public Modell{ private: double h; public: Gmodell(double ll, double bb, double hh); void setH(double hh); double getH(); double getVolumen(); } Die Methoden müssen noch außerhalb der Klassen implementiert werden.

  23. Realisieren Sie die Methoden in C++

  24. void Gmodell::setH(double hh){ h = hh; } double Gmodell::getH(){ return(h); } double Gmodell::getVolumen(){ return(getFlaeche()*h); } Diese Methode wird von der Klasse Modell vererbt.

  25. double Gmodell::getVolumen(){ return(b*l*h); } Warum ist diese Lösung falsch ? Es gibt Probleme mit dem Zugriffschutz (l und b sind private).Näheres dazu siehe später.

  26. Gmodell::Gmodell(double ll, double bb, double hh): Modell(ll,bb){ setH(hh); } Da die Klasse Gmodell von der Klasse Modell erbt, muß beim Anlegen eines Objekts der Klasse Gmodell auch der Konstruktor der Klasse Modell aufgerufen werden. Wird dies nicht gemacht, dann wird automatisch (ohne Zutun des Programmierers) der Standardkonstruktor der Klasse Modell aufgerufen. Was passiert, wenn der Standardkonstruktor nicht existiert ? Dann wird dieser automatisch vom Compiler angelegt, außer .... es gibt einen Konstruktor mit (1, 2, 3, ...) Parametern. Dann liefert der Compiler eine Fehlermeldung.

  27. Beispiel für die Benutzung der o.g. Klassen in einem Hauptprogramm:

  28. int main(){ Modell m(10,20); Gmodell g(2,3,4); double a,b,c, f, v; a = m.getL(); b = m.getB(); c = m.getH(); f = m.getFlaeche(); v = m.getVolumen(); a = g.getL(); b = g.getB(); c = g.getH(); f = g.getFlaeche(); v = g.getVolumen(); return 0; } // a=10 // b=20 // syntaktisch falsch // f=200 // synt. falsch // a=2 // b=3 // c=4 // f=6 // v=24

  29. Verdeckte Member

  30. class Gmodell:public Modell{ private: double h; public: Gmodell(double ll, double bb, double hh); void setH(double hh); double getH(); double getVolumen(); double getFlaeche(); } Alles gleich wie vorher außer, daß eine Methode gleichen Namens wie in der Basisklasse existiert, die die Oberfläche des Modells (Quaders) berechnet. Wie muss sie implementiert werden ?

  31. double Gmodell::getFlaeche(){ return(2*(getL()*getB()+getL()*h +getB()*h)); } double Gmodell::getFlaeche(){ return(2*(l*b+l*h+b*h)); } Warum ist diese Lösung falsch ? Es gibt Probleme mit dem Zugriffschutz (l und b sind private).Näheres dazu siehe später.

  32. Es wird auf die Methode der Unterklasse und nicht der Oberklasse zugegriffen, weil die Methode der Oberklasse durch die Methode der Unterklasse verdeckt wird. int main(){ Gmodell g(2,3,4); double f; f = g.getFlaeche(); return 0; } Von welcher Klasse wird diese Methode aufgerufen ? // f=52 f = g.Modell::getFlaeche(); // f=6 Mit Angabe der Klasse und des sogenannten Scope Operators :: kann man auf die verdeckten Mitglieder zugreifen.

  33. Darstellung der Vererbung durch UML

  34. Attribute Methoden Attribute Methoden Pfeil bedeutet: erbt von Analog zum Zugriffsschutz +und - bedeutet # : Methode ist protected

  35. Aufgabe: Stellen Sie die Klassen Modell, Gmodell und ihre Vererbungshierarchie in UML dar.

  36. Statt dem Zugriffschutz + oder - kann auch der Zugriffschutz # (siehe später) benutzt werden.

  37. Zugriffschutz (Zugriffsberechtigung) bei Klassen

  38. Bedeutung der Zugriffsarten:

  39. Zugriff innerhalb einer Klasse bedeutet den Zugriff auf ein Member von innerhalb einer Methode der Klasse. Beispiel: void Modell::setL(double ll){ l= ll; } Zugriff auf das Member setL

  40. Zugriff außerhalb einer Klasse bedeutet den Zugriff auf ein Member von einem Objekt mit Hilfe des Punkts . Beispiel: int main{ Modell m(2,8); m.setL(5); return 0; } Zugriff auf das Member setL

  41. Zugriffschutz (Zugriffsberechtigung) bei Klassen ohne Vererbung

  42. Beispiel:

  43. class Waisenkind{ private: int priWK; protected: int proWK; public: int pubWK; void f_WK(){ priWK=1; proWK; pubWK=3; } }; int main(){ Waisenkind myWK; myWK.f_WK(); myWK.priWK=10; myWK.proWK=11; myWK.pubWK=12; return 0; } Wo sind die Zugriffe ? Sind diese außerhalb/innerhalb ? Sind sie möglich ? Zugriff innerhalb, möglich Zugriff innerhalb, möglich Zugriff innerhalb, möglich Zugriff außerhalb, möglich Zugriff außerhalb, unmöglich Zugriff außerhalb, unmöglich Zugriff außerhalb, möglich

  44. class Waisenkind{ private: int priWK; protected: int proWK; public: int pubWK; void f_WK(){ priWK=1; proWK; pubWK=3; } }; int main(){ Waisenkind myWK; myWK.f_WK(); myWK.priWK=10; myWK.proWK=11; myWK.pubWK=12; return 0; } Welche Regel läßt sich daraus ableiten ? Zugriff innerhalb ist auf private, protected und public Member möglich. Zugriff außerhalb ist nur auf public Member möglich.

  45. Zugriffschutz (Zugriffsberechtigung) bei Klassen mit Vererbung

  46. Auf die nicht vererbten Member einer Klasse gilt die gleiche Regel wie vorher:Zugriff innerhalb ist auf private, protected und public Member möglich. Zugriff außerhalb ist nur auf public Member möglich.

  47. Das Problem ist nur:Wie ist der Zugriffschutz (Zugriffsberechtigung) auf die vererbten Member einer Klasse geregelt ?

  48. Zugriff auf die vererbten Member einer Klasse:

  49. Aus Platzgründen muss im Folgenden auf die Trennung von Deklaration und Implementierung der Methoden verzichtet werden.

  50. Beispiel:

More Related