Die Fähigkeit einer Klasse, Eigenschaften und Merkmale von einer anderen Klasse abzuleiten, wird Vererbung genannt. Vererbung ist eines der wichtigsten Merkmale der objektorientierten Programmierung.
Unterklasse: Die Klasse, die Eigenschaften von einer anderen Klasse erbt wird Unterklasse oder abgeleitete Klasse genannt.
Super Class:Die Klasse, deren Eigenschaften von Unterklasse geerbt wird Basisklasse oder Superklasse genannt.
Der Artikel ist in folgende Unterthemen unterteilt:
- Warum und wann Vererbung verwenden?,
- Vererbungsmodi
- Vererbungsarten
Warum und wann Vererbung verwenden?
Betrachten Sie eine Gruppe von Fahrzeugen. Sie müssen Klassen für Bus, Auto und LKW erstellen. Die Methoden fuelAmount (), capacity (), applyBrakes () sind für alle drei Klassen gleich., Wenn wir diese Klassen ohne Vererbung erstellen, müssen wir alle diese Funktionen in jede der drei Klassen schreiben, wie in der folgenden Abbildung gezeigt:
Sie können deutlich sehen, dass der obige Prozess dreimal zur Duplizierung desselben Codes führt. Dies erhöht die Wahrscheinlichkeit von Fehlern und Datenredundanz. Um diese Art von Situation zu vermeiden, wird Vererbung verwendet., Wenn wir ein Klassenfahrzeug erstellen und diese drei Funktionen darin schreiben und den Rest der Klassen von der Fahrzeugklasse erben, können wir einfach die Duplizierung von Daten vermeiden und die Wiederverwendbarkeit erhöhen. Schauen Sie sich das folgende Diagramm an, in dem die drei Klassen von der Fahrzeugklasse geerbt werden:
Mithilfe der Vererbung müssen wir die Funktionen nur einmal statt dreimal schreiben, da wir den Rest der drei Klassen von der Basisklasse(Fahrzeug) geerbt haben.,
Implementierung der Vererbung in C++: Zum Erstellen einer Unterklasse, die von der Basisklasse geerbt wird, müssen wir der folgenden Syntax folgen.
Syntax:
class subclass_name : access_mode base_class_name{ //body of subclass};
Hier ist subclass_name der Name der Unterklasse, access_mode ist der Modus, in dem Sie diese Unterklasse erben möchten, zum Beispiel: öffentlich, privat usw. und base_class_name ist der Name der Basisklasse, von der Sie die Unterklasse erben möchten.
Hinweis: Eine abgeleitete Klasse erbt keinen Zugriff auf private Datenmitglieder., Es erbt jedoch ein vollständiges übergeordnetes Objekt, das alle privaten Member enthält, die diese Klasse deklariert.
Ausgabe:
Child id is 7Parent id is 91
Im obigen Programm wird die ‚Child‘ – Klasse öffentlich von der ‚Parent‘ – Klasse geerbt, sodass die öffentlichen Datenmitglieder der Klasse ‚Parent‘ auch von der Klasse ‚Child’geerbt werden.“.
Vererbungsmodi
- Öffentlicher Modus: Wenn wir eine Unterklasse von einer öffentlichen Basisklasse ableiten., Dann wird das öffentliche Mitglied der Basisklasse in der abgeleiteten Klasse öffentlich und geschützte Mitglieder der Basisklasse werden in der abgeleiteten Klasse geschützt.
- Geschützter Modus: Wenn wir eine Unterklasse von einer geschützten Basisklasse ableiten. Dann werden sowohl öffentliche als auch geschützte Mitglieder der Basisklasse in der abgeleiteten Klasse geschützt.
- Privater Modus: Wenn wir eine Unterklasse von einer privaten Basisklasse ableiten. Dann werden sowohl öffentliche als auch geschützte Mitglieder der Basisklasse in der abgeleiteten Klasse privat.,
Hinweis: Auf die privaten Mitglieder in der Basisklasse kann nicht direkt in der abgeleiteten Klasse zugegriffen werden, während auf geschützte Mitglieder direkt zugegriffen werden kann. Beispielsweise enthalten die Klassen B, C und D alle die Variablen x, y und z im folgenden Beispiel. Es ist nur eine Frage des Zugangs.,
Die folgende Tabelle fasst die oben genannten drei Modi zusammen und zeigt den Zugriffsspezifizierer der Mitglieder der Basisklasse in der Unterklasse, wenn er im öffentlichen, geschützten und privaten Modus abgeleitet wird:
Vererbungstypen in C++
Ein Sonderfall der hybriden Vererbung : Mehrwegvererbung:
Eine abgeleitete Klasse mit zwei Basisklassen und diesen zwei Basisklassen haben eine gemeinsame Basisklasse heißt Multipath-Vererbung. Bei dieser Art der Vererbung kann eine Mehrdeutigkeit auftreten.,
Betrachten Sie das folgende Programm:
Ausgabe:
A from ClassB : 10A from ClassC : 100B : 20C : 30D : 40
Im obigen Beispiel erben beide ClassB &ClassC ClassA, beide haben eine einzelne Kopie von ClassA. ClassD erbt jedoch beide ClassB & ClassC, daher hat ClassD zwei Kopien von ClassA, eine von ClassB und eine von ClassC.,
Wenn wir über das Objekt von ClassD auf das Datenelement a von ClassA zugreifen müssen, müssen wir den Pfad angeben, von dem aus auf a zugegriffen werden soll, unabhängig davon, ob es sich um ClassB oder ClassC handelt, bco ‚ z Compiler kann nicht zwischen zwei Kopien von ClassA in ClassD unterscheiden.
Es gibt zwei Möglichkeiten, diese Mehrdeutigkeit zu vermeiden:
- Verwenden Sie den Bereichsauflösungsoperator
- Verwenden Sie die virtuelle Basisklasse
Vermeiden von Mehrdeutigkeiten mit dem Bereichsauflösungsoperator:
Mit dem Bereichsauflösungsoperator können wir manuell den Pfad angeben, von dem aus auf Datenelement a zugegriffen werden soll, wie in den Anweisungen 3 und 4 im obigen Beispiel gezeigt.,
obj.ClassB::a = 10;
obj.ClassC::a = 100;
Hinweis : Es gibt immer noch zwei Kopien von ClassA in ClassD.,
Vermeidung von Mehrdeutigkeiten mit virtuellen Basisklasse:
Ausgabe:
A : 100B : 20C : 30D : 40
Nach dem obigen Beispiel hat ClassD nur eine Kopie von ClassA, daher wird Anweisung 4 den Wert überschreiben von a, gegeben bei Aussage 3.
Dieser Artikel wird von Harsh Agarwal beigesteuert. Wenn Sie GeeksforGeeks mögen und einen Beitrag leisten möchten, können Sie auch einen Artikel mit schreiben contribute.geeksforgeeks.org oder mailen Sie Ihren Artikel an [email protected]., Sehen Sie sich Ihren Artikel auf der Hauptseite von GeeksforGeeks an und helfen Sie anderen Geeks.
Achtung reader! Hör jetzt nicht auf zu lernen. Holen Sie sich alle wichtigen C++ Foundation-und STL-Konzepte mit den C++ Foundation-und STL-Kursen zu einem studentenfreundlichen Preis und werden Sie industriefähig.