Besa Mavriqi
/
Mavriqi_Cpp_Aufgaben
Mavriqi_Aufgabe1_17.03.2020
Mavriqi_A2_Vererbung.cpp@3:e201d92a3120, 2020-04-21 (annotated)
- Committer:
- besam
- Date:
- Tue Apr 21 22:40:44 2020 +0000
- Revision:
- 3:e201d92a3120
- Parent:
- 1:e180d991bb83
.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
besam | 1:e180d991bb83 | 1 | /****************************************************************************** |
besam | 1:e180d991bb83 | 2 | Format der Dateinamen: Mavriqi_Besa_2_Vererbung |
besam | 1:e180d991bb83 | 3 | C++ Kurs BULME 19/20 SM |
besam | 1:e180d991bb83 | 4 | Datei 04 |
besam | 1:e180d991bb83 | 5 | |
besam | 1:e180d991bb83 | 6 | - Vererbung einer Basisklasse an abgeleitete Klassen |
besam | 1:e180d991bb83 | 7 | |
besam | 1:e180d991bb83 | 8 | Eine Klasse kann als die Basis für die Entwicklung einer neuen Klasse verwendet |
besam | 1:e180d991bb83 | 9 | werden, ohne dass ihr Code geändert werden muss. Dazu wird die neue Klasse |
besam | 1:e180d991bb83 | 10 | definiert, indem angegeben wird, dass sie eine abgeleitete Klasse der |
besam | 1:e180d991bb83 | 11 | Basisklasse ist. |
besam | 1:e180d991bb83 | 12 | |
besam | 1:e180d991bb83 | 13 | Während es in der letzten Lektion um den Aspekt der Kapselung gegangen ist, |
besam | 1:e180d991bb83 | 14 | geht es hier um den Aspekt der Vererbung. |
besam | 1:e180d991bb83 | 15 | |
besam | 1:e180d991bb83 | 16 | *******************************************************************************/ |
besam | 1:e180d991bb83 | 17 | #include <stdio.h> |
besam | 1:e180d991bb83 | 18 | #include <math.h> |
besam | 1:e180d991bb83 | 19 | |
besam | 1:e180d991bb83 | 20 | |
besam | 1:e180d991bb83 | 21 | enum eckig { ja, nein }; |
besam | 1:e180d991bb83 | 22 | |
besam | 1:e180d991bb83 | 23 | class Form // Basisklasse |
besam | 1:e180d991bb83 | 24 | { |
besam | 1:e180d991bb83 | 25 | // In der Basisklasse werden alle gemeinsamen Variablen |
besam | 1:e180d991bb83 | 26 | protected: |
besam | 1:e180d991bb83 | 27 | eckig m_hat_ecken; |
besam | 1:e180d991bb83 | 28 | float m_umfang; |
besam | 1:e180d991bb83 | 29 | float m_flaeche; |
besam | 1:e180d991bb83 | 30 | |
besam | 1:e180d991bb83 | 31 | public: // sowie auch alle gemeinsamen Methoden deklariert |
besam | 1:e180d991bb83 | 32 | float leseUmfang() { return m_umfang; } |
besam | 1:e180d991bb83 | 33 | float leseFlaeche() { return m_flaeche; } |
besam | 1:e180d991bb83 | 34 | |
besam | 1:e180d991bb83 | 35 | Form(eckig hat_ecken); |
besam | 1:e180d991bb83 | 36 | }; |
besam | 1:e180d991bb83 | 37 | |
besam | 1:e180d991bb83 | 38 | Form::Form(eckig ecken) { // im Konstruktor werden gem. Variablen initialisiert |
besam | 1:e180d991bb83 | 39 | m_hat_ecken = ecken; |
besam | 1:e180d991bb83 | 40 | m_umfang = 0; |
besam | 1:e180d991bb83 | 41 | m_flaeche = 0; |
besam | 1:e180d991bb83 | 42 | }; |
besam | 1:e180d991bb83 | 43 | // Hier wird eine von Form abgeleitete Klasse Kreis deklariert |
besam | 1:e180d991bb83 | 44 | class Kreis : public Form { |
besam | 1:e180d991bb83 | 45 | |
besam | 1:e180d991bb83 | 46 | protected: // Zugriffschutz protected bedeutet, dass abgeleitete |
besam | 1:e180d991bb83 | 47 | // Klassen ebenfalls zugreifen können. |
besam | 1:e180d991bb83 | 48 | float m_radius; |
besam | 1:e180d991bb83 | 49 | |
besam | 1:e180d991bb83 | 50 | public: |
besam | 1:e180d991bb83 | 51 | float leseUmfang(); |
besam | 1:e180d991bb83 | 52 | float leseFlaeche(); //Aufgabe 2.1 - Ergänzen Sie die Klasse Kreis um die Methode float leseFlaeche(); |
besam | 1:e180d991bb83 | 53 | |
besam | 1:e180d991bb83 | 54 | //Konstruktor hat den gleichen Name wie die Klasse |
besam | 1:e180d991bb83 | 55 | Kreis(float radius); // Neuer Konstruktor erfordert nur den radius |
besam | 1:e180d991bb83 | 56 | }; |
besam | 1:e180d991bb83 | 57 | |
besam | 1:e180d991bb83 | 58 | Kreis::Kreis(float radius) : Form(nein) { |
besam | 1:e180d991bb83 | 59 | // Im Konstruktor werden gleich die Membervariablen initialisiert |
besam | 1:e180d991bb83 | 60 | |
besam | 1:e180d991bb83 | 61 | // Über den radius werden Umfang und Fläche berechnet. |
besam | 1:e180d991bb83 | 62 | m_umfang = 2 * radius * M_PI; // Die Konstante M_PI ist in math.h definiert |
besam | 1:e180d991bb83 | 63 | m_flaeche = radius * radius * M_PI; |
besam | 1:e180d991bb83 | 64 | }; |
besam | 1:e180d991bb83 | 65 | |
besam | 1:e180d991bb83 | 66 | float Kreis::leseUmfang() { |
besam | 1:e180d991bb83 | 67 | // hier ist keine Änderung der Funktion nötig, |
besam | 1:e180d991bb83 | 68 | // daher wird die Funktion der Basisklasse aufger. |
besam | 1:e180d991bb83 | 69 | return m_umfang; |
besam | 1:e180d991bb83 | 70 | } |
besam | 1:e180d991bb83 | 71 | |
besam | 1:e180d991bb83 | 72 | float Kreis::leseFlaeche() { //hier ist auch keine Änderungder Funktion nötig |
besam | 1:e180d991bb83 | 73 | return m_flaeche; |
besam | 1:e180d991bb83 | 74 | } |
besam | 1:e180d991bb83 | 75 | |
besam | 1:e180d991bb83 | 76 | /*2. Leiten Sie von der Basisklasse Form die Klasse Rechteck ab |
besam | 1:e180d991bb83 | 77 | Überlegen Sie sich welche Parameter der Konstruktur für die Klasse |
besam | 1:e180d991bb83 | 78 | Rechteck benötigt. Implementieren sie neben dem Konstruktor auch alle |
besam | 1:e180d991bb83 | 79 | Methoden der Basisklasse, sodass korrekte Werte berechnet werden.*/ |
besam | 1:e180d991bb83 | 80 | |
besam | 1:e180d991bb83 | 81 | // Hier wird eine von Form abgeleitete Klasse Rechteck deklariert |
besam | 1:e180d991bb83 | 82 | class Rechteck : public Form |
besam | 1:e180d991bb83 | 83 | { |
besam | 1:e180d991bb83 | 84 | protected: |
besam | 1:e180d991bb83 | 85 | float a_laenge; //Rechteck hat die Länge a und Länge b |
besam | 1:e180d991bb83 | 86 | float b_laenge; |
besam | 1:e180d991bb83 | 87 | |
besam | 1:e180d991bb83 | 88 | public: |
besam | 1:e180d991bb83 | 89 | float leseUmfang(); //Die Methode wurde von Klasse Form abgeleitet |
besam | 1:e180d991bb83 | 90 | float leseFlaeche(); //Die Methode wurde von Klasse Form abgeleitet |
besam | 1:e180d991bb83 | 91 | |
besam | 1:e180d991bb83 | 92 | //Konstruktor hat den gleichen Name wie die Klasse |
besam | 1:e180d991bb83 | 93 | Rechteck (float a_laenge,float b_laenge); //Der neuer Konstruktor erfordert die beiden Längen |
besam | 1:e180d991bb83 | 94 | |
besam | 1:e180d991bb83 | 95 | }; |
besam | 1:e180d991bb83 | 96 | //Der Präfix Rechteck:: regelt die Zugehörigkeit der KLasse Rechteck |
besam | 1:e180d991bb83 | 97 | Rechteck::Rechteck (float a_laenge, float b_laenge): Form(ja) |
besam | 1:e180d991bb83 | 98 | { |
besam | 1:e180d991bb83 | 99 | m_umfang = (2 * a_laenge) +(2 * b_laenge); //Formel für Umfang U=2a*2b |
besam | 1:e180d991bb83 | 100 | m_flaeche = a_laenge * b_laenge; //Formel für Fläche A=a*a |
besam | 1:e180d991bb83 | 101 | }; |
besam | 1:e180d991bb83 | 102 | // Da wird die Funktion der Basisklasse aufger. |
besam | 1:e180d991bb83 | 103 | float Rechteck::leseUmfang() { return m_umfang; } |
besam | 1:e180d991bb83 | 104 | |
besam | 1:e180d991bb83 | 105 | // Da wird die Funktion der Basisklasse aufger. |
besam | 1:e180d991bb83 | 106 | float Rechteck::leseFlaeche() { return m_flaeche;} |
besam | 1:e180d991bb83 | 107 | |
besam | 1:e180d991bb83 | 108 | |
besam | 1:e180d991bb83 | 109 | |
besam | 1:e180d991bb83 | 110 | /* |
besam | 1:e180d991bb83 | 111 | 3. Optional: Leiten Sie von der Klasse Rechteck die Klasse Quadrat ab. |
besam | 1:e180d991bb83 | 112 | Implementieren Sie Konstruktor und alle Methoden in der Form, dass |
besam | 1:e180d991bb83 | 113 | die Implementierungen der Klasse Rechteck genutzt werden. |
besam | 1:e180d991bb83 | 114 | Quadrat soll eine Subklasse von Rechteck sein.*/ |
besam | 1:e180d991bb83 | 115 | |
besam | 1:e180d991bb83 | 116 | // Hier wird eine von Rechteck abgeleitete Klasse Quadrat deklariert |
besam | 1:e180d991bb83 | 117 | class Quadrat : public Form |
besam | 1:e180d991bb83 | 118 | { |
besam | 1:e180d991bb83 | 119 | protected: |
besam | 1:e180d991bb83 | 120 | float a_laenge; |
besam | 1:e180d991bb83 | 121 | |
besam | 1:e180d991bb83 | 122 | public: |
besam | 1:e180d991bb83 | 123 | float leseUmfang(); |
besam | 1:e180d991bb83 | 124 | float leseFlaeche(); |
besam | 1:e180d991bb83 | 125 | |
besam | 1:e180d991bb83 | 126 | Quadrat (float a_laenge); //Der Konstruktor erfordert nur eine Parameter,die Länge a |
besam | 1:e180d991bb83 | 127 | }; |
besam | 1:e180d991bb83 | 128 | |
besam | 1:e180d991bb83 | 129 | Quadrat::Quadrat(float a_laenge) : Form(ja){ |
besam | 1:e180d991bb83 | 130 | m_umfang = a_laenge * 4; |
besam | 1:e180d991bb83 | 131 | m_flaeche = a_laenge* a_laenge; |
besam | 1:e180d991bb83 | 132 | }; |
besam | 1:e180d991bb83 | 133 | // Da wird die Funktion der Basisklasse aufger. |
besam | 1:e180d991bb83 | 134 | float Quadrat::leseUmfang() { return m_umfang; } |
besam | 1:e180d991bb83 | 135 | |
besam | 1:e180d991bb83 | 136 | // Da wird die Funktion der Basisklasse aufger. |
besam | 1:e180d991bb83 | 137 | float Quadrat::leseFlaeche() { return m_flaeche;} |
besam | 1:e180d991bb83 | 138 | |
besam | 1:e180d991bb83 | 139 | |
besam | 1:e180d991bb83 | 140 | int main() |
besam | 1:e180d991bb83 | 141 | { |
besam | 1:e180d991bb83 | 142 | printf("Wir arbeiten nun mit abgeleiteten Klassen!\n"); |
besam | 1:e180d991bb83 | 143 | printf("Es wird ein Objekt kr der Klasse Kreis erzeugt!\n"); |
besam | 1:e180d991bb83 | 144 | printf("Eswird ein Objekt re der Klasse Rechteck erzeugt!\n"); |
besam | 1:e180d991bb83 | 145 | printf("Es wird ein Objekt qu der Klasse Quadrat erzeugt!\n"); |
besam | 1:e180d991bb83 | 146 | |
besam | 1:e180d991bb83 | 147 | Kreis kr(1.0); //Da wird zur Klasse Kreis zugegriffen,und hier wird dem Radium ein Wert zugewiesen |
besam | 1:e180d991bb83 | 148 | Rechteck re(1.0,2.0);//Klasse Rechteckt,der Lange a und b werden Werte zugewiesen |
besam | 1:e180d991bb83 | 149 | Quadrat qu(2.0); //Klasse Quadrat, der Länge a wird ein Wert zugewiesen |
besam | 1:e180d991bb83 | 150 | |
besam | 1:e180d991bb83 | 151 | float um_kr = kr.leseUmfang(); //Den Wert der Umfang aus der Klasse Kreis auslesen |
besam | 1:e180d991bb83 | 152 | float fl_kr = kr.leseFlaeche(); //Den Wert der Fläche aus der Klasse Kreis auslesen |
besam | 1:e180d991bb83 | 153 | float um_re = re.leseUmfang(); //Den Wert der Umfang aus der Klasse Rechteck auslesen |
besam | 1:e180d991bb83 | 154 | float fl_re = re.leseFlaeche(); //Den Wert der Fläche aus der Klasse Rechteck auslesen |
besam | 1:e180d991bb83 | 155 | float um_qu = qu.leseUmfang(); //Den Wert der Umfang aus der Klasse Quadrat auslesen |
besam | 1:e180d991bb83 | 156 | float fl_qu = qu.leseFlaeche(); //Den Wert der Fläche aus der Klasse Quadrat auslesen |
besam | 1:e180d991bb83 | 157 | |
besam | 1:e180d991bb83 | 158 | // Und nun die Werte ausgeben |
besam | 1:e180d991bb83 | 159 | printf("Der Umfang des Kreis ist: %f\n", um_kr); |
besam | 1:e180d991bb83 | 160 | printf("Der Flaeche des Kreis ist: %f\n", fl_kr); |
besam | 1:e180d991bb83 | 161 | printf("Der Umfang des Rechteck ist: %f\n", um_re); |
besam | 1:e180d991bb83 | 162 | printf("Der Flaeche des Rechteck ist: %f\n", fl_re); |
besam | 1:e180d991bb83 | 163 | printf("Der Umfang des Quadrat ist: %f\n", um_qu); |
besam | 1:e180d991bb83 | 164 | printf("Der Flaeche des Quadrat ist: %f\n", fl_qu); |
besam | 1:e180d991bb83 | 165 | |
besam | 1:e180d991bb83 | 166 | |
besam | 1:e180d991bb83 | 167 | return 0; |
besam | 1:e180d991bb83 | 168 | } |
besam | 1:e180d991bb83 | 169 | |
besam | 1:e180d991bb83 | 170 | |
besam | 1:e180d991bb83 | 171 | |
besam | 1:e180d991bb83 | 172 |