1. Klassen
RBuch_2_Vererbung.cpp@5:5a933dd926c4, 2020-04-28 (annotated)
- Committer:
- robertbuc
- Date:
- Tue Apr 28 10:20:41 2020 +0000
- Revision:
- 5:5a933dd926c4
- Parent:
- 1:d6ce98c83527
.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
robertbuc | 1:d6ce98c83527 | 1 | /****************************************************************************** |
robertbuc | 1:d6ce98c83527 | 2 | |
robertbuc | 1:d6ce98c83527 | 3 | C++ Kurs BULME 19/20 SM |
robertbuc | 1:d6ce98c83527 | 4 | Datei 04 |
robertbuc | 1:d6ce98c83527 | 5 | |
robertbuc | 1:d6ce98c83527 | 6 | - Vererbung einer Basisklasse an abgeleitete Klassen |
robertbuc | 1:d6ce98c83527 | 7 | |
robertbuc | 1:d6ce98c83527 | 8 | Eine Klasse kann als die Basis für die Entwicklung einer neuen Klasse verwendet |
robertbuc | 1:d6ce98c83527 | 9 | werden, ohne dass ihr Code geändert werden muss. Dazu wird die neue Klasse |
robertbuc | 1:d6ce98c83527 | 10 | definiert, indem angegeben wird, dass sie eine abgeleitete Klasse der |
robertbuc | 1:d6ce98c83527 | 11 | Basisklasse ist. |
robertbuc | 1:d6ce98c83527 | 12 | |
robertbuc | 1:d6ce98c83527 | 13 | Während es in der letzten Lektion um den Aspekt der Kapselung gegangen ist, |
robertbuc | 1:d6ce98c83527 | 14 | geht es hier um den Aspekt der Vererbung. |
robertbuc | 1:d6ce98c83527 | 15 | |
robertbuc | 1:d6ce98c83527 | 16 | |
robertbuc | 1:d6ce98c83527 | 17 | /* Ihre Aufgaben! |
robertbuc | 1:d6ce98c83527 | 18 | 1. Ergänzen Sie die Klasse Kreis um die Methode float berechneFlaeche(); |
robertbuc | 1:d6ce98c83527 | 19 | |
robertbuc | 1:d6ce98c83527 | 20 | 2. Leiten Sie von der Basisklasse Form die Klasse Rechteck ab |
robertbuc | 1:d6ce98c83527 | 21 | Überlegen Sie sich welche Parameter der Konstruktur für die Klasse |
robertbuc | 1:d6ce98c83527 | 22 | Rechteck benötigt. Implementieren sie neben dem Konstruktor auch alle |
robertbuc | 1:d6ce98c83527 | 23 | Methoden der Basisklasse, sodass korrekte Werte berechnet werden. |
robertbuc | 1:d6ce98c83527 | 24 | |
robertbuc | 1:d6ce98c83527 | 25 | 3. Optional: Leiten Sie von der Klasse Rechteck die Klasse Quadrat ab. |
robertbuc | 1:d6ce98c83527 | 26 | Implementieren Sie Konstruktor und alle Methoden in der Form, dass |
robertbuc | 1:d6ce98c83527 | 27 | die Implementierungen der Klasse Rechteck genutzt werden. |
robertbuc | 1:d6ce98c83527 | 28 | |
robertbuc | 1:d6ce98c83527 | 29 | |
robertbuc | 1:d6ce98c83527 | 30 | |
robertbuc | 1:d6ce98c83527 | 31 | form, rechteck, quadrat (subklasse von rechteck) |
robertbuc | 1:d6ce98c83527 | 32 | */ |
robertbuc | 1:d6ce98c83527 | 33 | /*******************************************************************************/ |
robertbuc | 1:d6ce98c83527 | 34 | #include <stdio.h> |
robertbuc | 1:d6ce98c83527 | 35 | #include <math.h> |
robertbuc | 1:d6ce98c83527 | 36 | |
robertbuc | 1:d6ce98c83527 | 37 | enum eckig { ja, nein }; |
robertbuc | 1:d6ce98c83527 | 38 | |
robertbuc | 1:d6ce98c83527 | 39 | class Form // Basisklasse |
robertbuc | 1:d6ce98c83527 | 40 | { |
robertbuc | 1:d6ce98c83527 | 41 | // In der Basisklasse werden alle gemeinsamen Variablen |
robertbuc | 1:d6ce98c83527 | 42 | protected: |
robertbuc | 1:d6ce98c83527 | 43 | eckig m_hat_ecken; |
robertbuc | 1:d6ce98c83527 | 44 | float m_umfang; |
robertbuc | 1:d6ce98c83527 | 45 | float m_flaeche; |
robertbuc | 1:d6ce98c83527 | 46 | |
robertbuc | 1:d6ce98c83527 | 47 | public: // sowie auch alle gemeinsamen Methoden deklariert |
robertbuc | 1:d6ce98c83527 | 48 | float leseUmfang() { return m_umfang; }; |
robertbuc | 1:d6ce98c83527 | 49 | float leseFlaeche() { return m_flaeche; }; |
robertbuc | 1:d6ce98c83527 | 50 | |
robertbuc | 1:d6ce98c83527 | 51 | Form(eckig hat_ecken); //konstruktor |
robertbuc | 1:d6ce98c83527 | 52 | }; |
robertbuc | 1:d6ce98c83527 | 53 | |
robertbuc | 1:d6ce98c83527 | 54 | Form::Form(eckig ecken) { // im Konstruktor werden gem. Variablen initialisiert |
robertbuc | 1:d6ce98c83527 | 55 | m_hat_ecken = ecken; |
robertbuc | 1:d6ce98c83527 | 56 | m_umfang = 0; |
robertbuc | 1:d6ce98c83527 | 57 | m_flaeche = 0; |
robertbuc | 1:d6ce98c83527 | 58 | }; |
robertbuc | 1:d6ce98c83527 | 59 | |
robertbuc | 1:d6ce98c83527 | 60 | |
robertbuc | 1:d6ce98c83527 | 61 | //Kreis |
robertbuc | 1:d6ce98c83527 | 62 | class Kreis : public Form { // Hier wird eine von Form abgeleitete Klasse Kreis deklariert |
robertbuc | 1:d6ce98c83527 | 63 | |
robertbuc | 1:d6ce98c83527 | 64 | protected: // Zugriffschutz protected bedeutet, dass abgeleitete |
robertbuc | 1:d6ce98c83527 | 65 | float m_radius; // Klassen ebenfalls zugreifen können. |
robertbuc | 1:d6ce98c83527 | 66 | |
robertbuc | 1:d6ce98c83527 | 67 | public: |
robertbuc | 1:d6ce98c83527 | 68 | Kreis(float radius); // Neuer Konstruktor erfordert nur den radius |
robertbuc | 1:d6ce98c83527 | 69 | }; |
robertbuc | 1:d6ce98c83527 | 70 | |
robertbuc | 1:d6ce98c83527 | 71 | Kreis::Kreis(float radius) : Form(nein) { |
robertbuc | 1:d6ce98c83527 | 72 | // Im Konstruktor werden gleich die Membervariablen initialisiert |
robertbuc | 1:d6ce98c83527 | 73 | |
robertbuc | 1:d6ce98c83527 | 74 | // Über den radius werden Umfang und Fläche berechnet. |
robertbuc | 1:d6ce98c83527 | 75 | m_umfang = 2 * radius * M_PI; // Die Konstante M_PI ist in math.h definiert |
robertbuc | 1:d6ce98c83527 | 76 | m_flaeche = radius * radius * M_PI; |
robertbuc | 1:d6ce98c83527 | 77 | }; |
robertbuc | 1:d6ce98c83527 | 78 | |
robertbuc | 1:d6ce98c83527 | 79 | |
robertbuc | 1:d6ce98c83527 | 80 | |
robertbuc | 1:d6ce98c83527 | 81 | /* |
robertbuc | 1:d6ce98c83527 | 82 | 2. Leiten Sie von der Basisklasse Form die Klasse Rechteck ab |
robertbuc | 1:d6ce98c83527 | 83 | Überlegen Sie sich welche Parameter der Konstruktur für die Klasse |
robertbuc | 1:d6ce98c83527 | 84 | Rechteck benötigt. Implementieren sie neben dem Konstruktor auch alle |
robertbuc | 1:d6ce98c83527 | 85 | Methoden der Basisklasse, sodass korrekte Werte berechnet werden. |
robertbuc | 1:d6ce98c83527 | 86 | */ |
robertbuc | 1:d6ce98c83527 | 87 | |
robertbuc | 1:d6ce98c83527 | 88 | |
robertbuc | 1:d6ce98c83527 | 89 | //Rechteck |
robertbuc | 1:d6ce98c83527 | 90 | class Rechteck : public Form { |
robertbuc | 1:d6ce98c83527 | 91 | |
robertbuc | 1:d6ce98c83527 | 92 | protected: |
robertbuc | 1:d6ce98c83527 | 93 | float m_length; |
robertbuc | 1:d6ce98c83527 | 94 | float m_width; |
robertbuc | 1:d6ce98c83527 | 95 | |
robertbuc | 1:d6ce98c83527 | 96 | public: |
robertbuc | 1:d6ce98c83527 | 97 | Rechteck(float length,float width); |
robertbuc | 1:d6ce98c83527 | 98 | float getm_length(); |
robertbuc | 1:d6ce98c83527 | 99 | float getm_width(); |
robertbuc | 1:d6ce98c83527 | 100 | }; |
robertbuc | 1:d6ce98c83527 | 101 | |
robertbuc | 1:d6ce98c83527 | 102 | Rechteck::Rechteck(float length,float width) : Form(ja) { |
robertbuc | 1:d6ce98c83527 | 103 | m_length=length; |
robertbuc | 1:d6ce98c83527 | 104 | m_width=width; |
robertbuc | 1:d6ce98c83527 | 105 | m_umfang = 2*length+2*width; |
robertbuc | 1:d6ce98c83527 | 106 | m_flaeche = length * width; |
robertbuc | 1:d6ce98c83527 | 107 | }; |
robertbuc | 1:d6ce98c83527 | 108 | |
robertbuc | 1:d6ce98c83527 | 109 | float Rechteck::getm_length() |
robertbuc | 1:d6ce98c83527 | 110 | { |
robertbuc | 1:d6ce98c83527 | 111 | return m_length; |
robertbuc | 1:d6ce98c83527 | 112 | } |
robertbuc | 1:d6ce98c83527 | 113 | |
robertbuc | 1:d6ce98c83527 | 114 | float Rechteck::getm_width() |
robertbuc | 1:d6ce98c83527 | 115 | { |
robertbuc | 1:d6ce98c83527 | 116 | return m_width; |
robertbuc | 1:d6ce98c83527 | 117 | } |
robertbuc | 1:d6ce98c83527 | 118 | |
robertbuc | 1:d6ce98c83527 | 119 | |
robertbuc | 1:d6ce98c83527 | 120 | |
robertbuc | 1:d6ce98c83527 | 121 | /* |
robertbuc | 1:d6ce98c83527 | 122 | 3. Optional: Leiten Sie von der Klasse Rechteck die Klasse Quadrat ab. |
robertbuc | 1:d6ce98c83527 | 123 | Implementieren Sie Konstruktor und alle Methoden in der Form, dass |
robertbuc | 1:d6ce98c83527 | 124 | die Implementierungen der Klasse Rechteck genutzt werden. |
robertbuc | 1:d6ce98c83527 | 125 | */ |
robertbuc | 1:d6ce98c83527 | 126 | |
robertbuc | 1:d6ce98c83527 | 127 | //quadrat |
robertbuc | 1:d6ce98c83527 | 128 | |
robertbuc | 1:d6ce98c83527 | 129 | class Quadrat : public Rechteck{ |
robertbuc | 1:d6ce98c83527 | 130 | public: |
robertbuc | 1:d6ce98c83527 | 131 | Quadrat(float length); |
robertbuc | 1:d6ce98c83527 | 132 | }; |
robertbuc | 1:d6ce98c83527 | 133 | |
robertbuc | 1:d6ce98c83527 | 134 | Quadrat::Quadrat(float length) : Rechteck(length,length) { //'width’ not declared |
robertbuc | 1:d6ce98c83527 | 135 | //m_umfang=4*length; |
robertbuc | 1:d6ce98c83527 | 136 | //m_flaeche=length*length; |
robertbuc | 1:d6ce98c83527 | 137 | } |
robertbuc | 1:d6ce98c83527 | 138 | |
robertbuc | 1:d6ce98c83527 | 139 | |
robertbuc | 1:d6ce98c83527 | 140 | |
robertbuc | 1:d6ce98c83527 | 141 | |
robertbuc | 1:d6ce98c83527 | 142 | |
robertbuc | 1:d6ce98c83527 | 143 | |
robertbuc | 1:d6ce98c83527 | 144 | int main() |
robertbuc | 1:d6ce98c83527 | 145 | { |
robertbuc | 1:d6ce98c83527 | 146 | printf("Wir arbeiten nun mit abgeleiteten Klassen!\n"); |
robertbuc | 1:d6ce98c83527 | 147 | printf("Nun wird ein Objekt kr der Klasse Kreis erzeugt!\n"); |
robertbuc | 1:d6ce98c83527 | 148 | Kreis kr(1.0); |
robertbuc | 1:d6ce98c83527 | 149 | float um = kr.leseUmfang(); |
robertbuc | 1:d6ce98c83527 | 150 | printf("\nDer Umfang des Kreis beträgt: %0.4f\n", um); |
robertbuc | 1:d6ce98c83527 | 151 | float fl=kr.leseFlaeche(); |
robertbuc | 1:d6ce98c83527 | 152 | printf("Die Flaeche des Kreis beträgt: %0.4f\n", fl); |
robertbuc | 1:d6ce98c83527 | 153 | |
robertbuc | 1:d6ce98c83527 | 154 | |
robertbuc | 1:d6ce98c83527 | 155 | Rechteck re(1.0,2.0); |
robertbuc | 1:d6ce98c83527 | 156 | printf("\nDie Rechteck-Länge: %0.2f\n", re.getm_length()); |
robertbuc | 1:d6ce98c83527 | 157 | printf("Die Rechteck-Breite: %0.2f\n", re.getm_width()); |
robertbuc | 1:d6ce98c83527 | 158 | printf("Der Umfang des Rechtecks beträgt: %0.4f\n", re.leseUmfang()); |
robertbuc | 1:d6ce98c83527 | 159 | printf("Die Flaeche des Rechtecks beträgt: %0.4f\n", re.leseFlaeche()); |
robertbuc | 1:d6ce98c83527 | 160 | |
robertbuc | 1:d6ce98c83527 | 161 | Quadrat qu(2.5); |
robertbuc | 1:d6ce98c83527 | 162 | printf("\nDie Quadrat-Länge: %0.2f\n", qu.getm_length()); |
robertbuc | 1:d6ce98c83527 | 163 | printf("Der Umfang des Quadrats beträgt: %0.4f\n", qu.leseUmfang()); |
robertbuc | 1:d6ce98c83527 | 164 | printf("Die Flaeche des Quadrats beträgt: %0.4f\n", qu.leseFlaeche()); |
robertbuc | 1:d6ce98c83527 | 165 | |
robertbuc | 1:d6ce98c83527 | 166 | |
robertbuc | 1:d6ce98c83527 | 167 | return 0; |
robertbuc | 1:d6ce98c83527 | 168 | } |
robertbuc | 1:d6ce98c83527 | 169 | |
robertbuc | 1:d6ce98c83527 | 170 | /* |
robertbuc | 1:d6ce98c83527 | 171 | Weiterführende Links: |
robertbuc | 1:d6ce98c83527 | 172 | https://os.mbed.com/users/fpucher/code/HIM0Board/wiki/Vererbung-in-C++ |
robertbuc | 1:d6ce98c83527 | 173 | https://de.wikibooks.org/wiki/C%2B%2B-Programmierung:_Vererbung |
robertbuc | 1:d6ce98c83527 | 174 | */ |
robertbuc | 1:d6ce98c83527 | 175 | |
robertbuc | 1:d6ce98c83527 | 176 |