1. Klassen

Committer:
robertbuc
Date:
Tue Apr 28 10:20:41 2020 +0000
Revision:
5:5a933dd926c4
Parent:
1:d6ce98c83527
.

Who changed what in which revision?

UserRevisionLine numberNew 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