C++ Vererbung von Konstruktoren
![C++ Vererbung von Konstruktoren](/img/Cpp/feature-image---cpp-inheritance-constructor.webp)
In diesem Artikel geht es um das Vererbungskonzept in C++ und wie wir die Konstruktoren der Basisklasse in der abgeleiteten Klasse erben können.
Vererbung in C++
In C++, insbesondere in der objektorientierten Programmierung, ist das grundlegendste und am weitesten verbreitete Konzept das der Vererbung. Es ist eine Funktion, mit der wir eine Klasse als untergeordnete Klasse einer anderen definieren können.
Dadurch können wir auch einige Codefunktionen wiederverwenden und unsere Implementierungszeit verkürzen. Es ermöglicht uns, die Funktionalitäten und Eigenschaften von der Basisklasse in die abgeleitete Klasse abzuleiten.
- Basisklasse – Die Klasse, deren Eigenschaften und Funktionalitäten von einer anderen Klasse verwendet werden, wird als Basisklasse bezeichnet. Es wird manchmal auch als Superklasse bezeichnet.
- Abgeleitete Klasse – Die Klasse, die die Eigenschaften und Funktionalitäten einer anderen Klasse aufnimmt, wird als abgeleitete Klasse bezeichnet. Sie wird manchmal auch als Unterklasse bezeichnet.
Betrachten Sie ein Beispiel für einige Fahrzeuge. Auto, Bus und Lastwagen sind alle Autos, und alle diese Autos haben einige gemeinsame Eigenschaften, und einige sind unterschiedlich.
Da dies alles Autos sind und alle Autos einige Funktionalitäten haben, die unter allen einheitlich sind. Wenn wir Klassen für all diese Autos erstellen, werden wir eine Menge Code duplizieren.
Dies ist in der Abbildung unten dargestellt.
Sie können aus dem obigen Bild ersehen, dass alle Autos die gleichen Funktionen haben. Dadurch wird der Code dreimal dupliziert.
Die Codeduplizierung führt zu vielen anderen Problemen, wie z. B. Fehlerwahrscheinlichkeit, längere Verarbeitungszeit usw. Vererbung wird verwendet, um solche Situationen zu überwinden.
Wir können eine Klasse Automobile
erstellen, die aus all diesen Funktionalitäten besteht, und die restlichen Klassen mit dieser Klasse ableiten. Dadurch können wir die Code-Duplizierung verringern und die Wiederverwendbarkeit des Codes erhöhen.
Sie können aus dem obigen Bild ersehen, dass wir den doppelten Code reduziert haben und alle Funktionalitäten in allen Klassen enthalten sind. Vererbung definiert normalerweise eine Ist-ein
-Beziehung.
Zum Beispiel ist ein Auto ein
Auto, ein Kreis ist eine
Form, ein Hund ist ein
Tier usw.
Implementierung der Vererbung in C++
Wir müssen der folgenden Syntax folgen, um eine Unterklasse von einer Basisklasse abzuleiten.
class derived - class - name : access - specifier base - class - name { .. }
Dieser Zugriffsspezifizierer ist da, um zu entscheiden, wie wir die Funktionalitäten von der Basisklasse erben müssen. Ob wir alle oder einige davon benötigen, wird anhand des Zugriffsbezeichners entschieden.
Sie kann public
, private
oder protected
sein. Wenn wir den Zugriffsspezifizierer nicht angeben, ist er standardmäßig privat
.
Beispiel:
public
class Automobile {
public:
getFuelAmount();
applyBrakes();
startEngine();
stopEngine();
} public class Car : public Automobile {
pressHorn();
} public class Bus : public Automobile {
pressHorn();
}
Aus dem obigen Code ist ersichtlich, dass die beiden abgeleiteten Klassen nur eine Funktion haben, die für beide nicht einheitlich ist, da der Klang der Hupe bei allen Fahrzeugen unterschiedlich ist. Daher haben wir diese Funktion in der abgeleiteten Klasse erstellt, und der Rest befindet sich in der Basisklasse.
Betrachten Sie ein weiteres Beispiel der Klasse Shapes
.
#include <iostream>
#include <string>
using namespace std;
class Shapes {
public:
int w;
int h;
};
class Square : public Shapes {
public:
int getArea() { return w * h; }
};
int main() {
Square s;
s.w = 5;
s.h = 5;
cout << "Area: " << s.getArea() << endl;
return 0;
}
Ausgabe:
Area: 25
Konstruktorvererbung in C++
Wir können aus dem vorherigen Beispiel ersehen, dass die Funktionen und Eigenschaften in der abgeleiteten Klasse wie von der Basisklasse geerbt werden. Aber wenn wir den Konstruktor der Basisklasse aufrufen müssen, müssen wir ihn explizit im Konstruktor der abgeleiteten Klasse aufrufen.
Konstruktoren werden nicht automatisch aufgerufen. Betrachten Sie ein Beispiel unten.
#include <iostream>
using namespace std;
class baseClass {
public:
baseClass() { cout << "In constructor: Base" << endl; }
};
class derivedClass : public baseClass {
public:
derivedClass() : baseClass() { cout << "In Constructor: derived" << endl; }
};
int main() {
derivedClass d;
cout << "In main" << endl;
}
Ausgabe:
In constructor: Base
In Constructor: derived
In main
In C++11 kann dies mit using-declaration
erfolgen. Mit using-declaration
können wir eine abgeleitete Klassenfunktion in der Basisklasse verwenden.
Das obige Beispiel kann wie folgt modifiziert werden.
#include <iostream>
using namespace std;
class baseClass {
public:
baseClass() { cout << "In constructor: Base" << endl; }
};
class derivedClass : public baseClass {
using baseClass::baseClass;
public:
derivedClass() { cout << "In Constructor: derived" << endl; }
};
int main() {
derivedClass d;
cout << "In main" << endl;
}
Es wird auch die gleiche Ausgabe liefern.
In constructor: Base
In Constructor: derived
In main
Husnain is a professional Software Engineer and a researcher who loves to learn, build, write, and teach. Having worked various jobs in the IT industry, he especially enjoys finding ways to express complex ideas in simple ways through his content. In his free time, Husnain unwinds by thinking about tech fiction to solve problems around him.
LinkedIn