Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: mbed
Mavriqi_A2_Vererbung.cpp
- Committer:
- besam
- Date:
- 2020-03-31
- Revision:
- 1:e180d991bb83
- Parent:
- 0:f95c6d28f17d
File content as of revision 1:e180d991bb83:
/******************************************************************************
Format der Dateinamen: Mavriqi_Besa_2_Vererbung
C++ Kurs BULME 19/20 SM
Datei 04
- Vererbung einer Basisklasse an abgeleitete Klassen
Eine Klasse kann als die Basis für die Entwicklung einer neuen Klasse verwendet
werden, ohne dass ihr Code geändert werden muss. Dazu wird die neue Klasse
definiert, indem angegeben wird, dass sie eine abgeleitete Klasse der
Basisklasse ist.
Während es in der letzten Lektion um den Aspekt der Kapselung gegangen ist,
geht es hier um den Aspekt der Vererbung.
*******************************************************************************/
#include <stdio.h>
#include <math.h>
enum eckig { ja, nein };
class Form // Basisklasse
{
// In der Basisklasse werden alle gemeinsamen Variablen
protected:
eckig m_hat_ecken;
float m_umfang;
float m_flaeche;
public: // sowie auch alle gemeinsamen Methoden deklariert
float leseUmfang() { return m_umfang; }
float leseFlaeche() { return m_flaeche; }
Form(eckig hat_ecken);
};
Form::Form(eckig ecken) { // im Konstruktor werden gem. Variablen initialisiert
m_hat_ecken = ecken;
m_umfang = 0;
m_flaeche = 0;
};
// Hier wird eine von Form abgeleitete Klasse Kreis deklariert
class Kreis : public Form {
protected: // Zugriffschutz protected bedeutet, dass abgeleitete
// Klassen ebenfalls zugreifen können.
float m_radius;
public:
float leseUmfang();
float leseFlaeche(); //Aufgabe 2.1 - Ergänzen Sie die Klasse Kreis um die Methode float leseFlaeche();
//Konstruktor hat den gleichen Name wie die Klasse
Kreis(float radius); // Neuer Konstruktor erfordert nur den radius
};
Kreis::Kreis(float radius) : Form(nein) {
// Im Konstruktor werden gleich die Membervariablen initialisiert
// Über den radius werden Umfang und Fläche berechnet.
m_umfang = 2 * radius * M_PI; // Die Konstante M_PI ist in math.h definiert
m_flaeche = radius * radius * M_PI;
};
float Kreis::leseUmfang() {
// hier ist keine Änderung der Funktion nötig,
// daher wird die Funktion der Basisklasse aufger.
return m_umfang;
}
float Kreis::leseFlaeche() { //hier ist auch keine Änderungder Funktion nötig
return m_flaeche;
}
/*2. Leiten Sie von der Basisklasse Form die Klasse Rechteck ab
Überlegen Sie sich welche Parameter der Konstruktur für die Klasse
Rechteck benötigt. Implementieren sie neben dem Konstruktor auch alle
Methoden der Basisklasse, sodass korrekte Werte berechnet werden.*/
// Hier wird eine von Form abgeleitete Klasse Rechteck deklariert
class Rechteck : public Form
{
protected:
float a_laenge; //Rechteck hat die Länge a und Länge b
float b_laenge;
public:
float leseUmfang(); //Die Methode wurde von Klasse Form abgeleitet
float leseFlaeche(); //Die Methode wurde von Klasse Form abgeleitet
//Konstruktor hat den gleichen Name wie die Klasse
Rechteck (float a_laenge,float b_laenge); //Der neuer Konstruktor erfordert die beiden Längen
};
//Der Präfix Rechteck:: regelt die Zugehörigkeit der KLasse Rechteck
Rechteck::Rechteck (float a_laenge, float b_laenge): Form(ja)
{
m_umfang = (2 * a_laenge) +(2 * b_laenge); //Formel für Umfang U=2a*2b
m_flaeche = a_laenge * b_laenge; //Formel für Fläche A=a*a
};
// Da wird die Funktion der Basisklasse aufger.
float Rechteck::leseUmfang() { return m_umfang; }
// Da wird die Funktion der Basisklasse aufger.
float Rechteck::leseFlaeche() { return m_flaeche;}
/*
3. Optional: Leiten Sie von der Klasse Rechteck die Klasse Quadrat ab.
Implementieren Sie Konstruktor und alle Methoden in der Form, dass
die Implementierungen der Klasse Rechteck genutzt werden.
Quadrat soll eine Subklasse von Rechteck sein.*/
// Hier wird eine von Rechteck abgeleitete Klasse Quadrat deklariert
class Quadrat : public Form
{
protected:
float a_laenge;
public:
float leseUmfang();
float leseFlaeche();
Quadrat (float a_laenge); //Der Konstruktor erfordert nur eine Parameter,die Länge a
};
Quadrat::Quadrat(float a_laenge) : Form(ja){
m_umfang = a_laenge * 4;
m_flaeche = a_laenge* a_laenge;
};
// Da wird die Funktion der Basisklasse aufger.
float Quadrat::leseUmfang() { return m_umfang; }
// Da wird die Funktion der Basisklasse aufger.
float Quadrat::leseFlaeche() { return m_flaeche;}
int main()
{
printf("Wir arbeiten nun mit abgeleiteten Klassen!\n");
printf("Es wird ein Objekt kr der Klasse Kreis erzeugt!\n");
printf("Eswird ein Objekt re der Klasse Rechteck erzeugt!\n");
printf("Es wird ein Objekt qu der Klasse Quadrat erzeugt!\n");
Kreis kr(1.0); //Da wird zur Klasse Kreis zugegriffen,und hier wird dem Radium ein Wert zugewiesen
Rechteck re(1.0,2.0);//Klasse Rechteckt,der Lange a und b werden Werte zugewiesen
Quadrat qu(2.0); //Klasse Quadrat, der Länge a wird ein Wert zugewiesen
float um_kr = kr.leseUmfang(); //Den Wert der Umfang aus der Klasse Kreis auslesen
float fl_kr = kr.leseFlaeche(); //Den Wert der Fläche aus der Klasse Kreis auslesen
float um_re = re.leseUmfang(); //Den Wert der Umfang aus der Klasse Rechteck auslesen
float fl_re = re.leseFlaeche(); //Den Wert der Fläche aus der Klasse Rechteck auslesen
float um_qu = qu.leseUmfang(); //Den Wert der Umfang aus der Klasse Quadrat auslesen
float fl_qu = qu.leseFlaeche(); //Den Wert der Fläche aus der Klasse Quadrat auslesen
// Und nun die Werte ausgeben
printf("Der Umfang des Kreis ist: %f\n", um_kr);
printf("Der Flaeche des Kreis ist: %f\n", fl_kr);
printf("Der Umfang des Rechteck ist: %f\n", um_re);
printf("Der Flaeche des Rechteck ist: %f\n", fl_re);
printf("Der Umfang des Quadrat ist: %f\n", um_qu);
printf("Der Flaeche des Quadrat ist: %f\n", fl_qu);
return 0;
}