inheritance c
Belang van overerving in C ++ met voorbeelden:
Overerving is een van de belangrijkste kenmerken van objectgeoriënteerd programmeren.
Overerving is de techniek waarmee de ene klasse de eigenschappen en methoden van een andere klasse verwerft. Op deze manier kunnen we de code die al is geschreven en geverifieerd hergebruiken. De klasse die de eigenschappen van een andere klasse verwerft, wordt de subklasse of afgeleide klasse of child-klasse genoemd.
De klasse waarvan de eigenschappen worden verkregen, wordt de basisklasse of bovenliggende klasse of superklasse genoemd. Wanneer een klasse een andere klasse verwerft of erft, zijn alle eigenschappen en methoden van de basisklasse beschikbaar voor de afgeleide klasse, zodat we deze code opnieuw kunnen gebruiken.
Bezoek hier om C ++ vanaf het begin te leren.
interviewvragen over agile scrum-methodologie
Wat je leert:
- Waarom hebben we erfenis nodig?
- Wijzen van overerving
- Orde van constructeurs / vernietigers in erfenis
- Soorten erfenis
- Sjabloonovererving
- Samenstelling
- Hoe moeten we beslissen tussen samenstelling en overerving?
- Gevolgtrekking
- Aanbevolen literatuur
Waarom hebben we erfenis nodig?
Beschouw een groep voertuigen zoals auto, bus, jeep, enz. Elk van deze voertuigen heeft eigenschappen en methoden zoals aangegeven in het onderstaande diagram.
Als we voor de bovenstaande voertuigen afzonderlijke klassen moeten implementeren, kunnen we zien dat we in alle drie de klassen dezelfde code moeten schrijven, omdat alle drie de typen voertuigen min of meer dezelfde eigenschappen vertonen. Dit zal ons programma inefficiënt en omslachtig maken omdat er veel dubbele code zal zijn.
In plaats van een gedupliceerde code zoals hierboven te schrijven, kunnen we de overervingsfunctie implementeren om te voorkomen dat de code dupliceert en ook een enkel stuk code schrijven en deze in alle drie de klassen gebruiken. Dit wordt picturaal weergegeven zoals hieronder.
In bovenstaande figuur hebben we een basisklasse “Voertuigen” gedefinieerd en de klassen Auto, Bus en Jeep afgeleid uit deze klasse. De algemene methoden en eigenschappen maken nu deel uit van de klasse Voertuigen. Aangezien andere klassen zijn afgeleid van de klasse Voertuigen, verwerven alle klassen deze methoden en eigenschappen.
Daarom hoeven we de gemeenschappelijke code maar één keer en alle drie de klassen te schrijven; Auto, Bus en Jeep zullen het aanschaffen.
Het belangrijkste voordeel dat we krijgen door de bestaande klassen te erven of het overervingsmechanisme te ontwerpen, is de herbruikbaarheid van code.
Verder lezen = >> Zelfstudie over overerving van Java
Het algemene formaat voor het erven van een klasse is:
Hier ' afgeleide_klasse 'Is de naam van de afgeleide klasse,' access_specifier 'Is de toegangsmodus, d.w.z. openbaar, beschermd of privé waarin de afgeleide klasse de basisklasse moet erven en' afgeleide_klasse ”Is de naam van de basisklasse waarvan de afgeleide klasse erft.
Wijzen van overerving
De “access_specifier” getoond in de bovenstaande verklaring van overerving, kan hun waarden hebben zoals hieronder getoond.
Afhankelijk van de access_specifier die is opgegeven wanneer we de klasse erven, hebben we verschillende manieren van overerving, zoals hieronder vermeld.
Openbare erfenis
Algemene syntaxis
Wanneer openbare toegangsspecificatie is opgegeven, worden de openbare leden van de basisklasse als openbaar overgeërfd, terwijl beschermde leden worden beschermd. Privé-leden blijven privé. Dit is de meest populaire manier van overerving.
Privé-erfenis
Algemene syntaxis
Privé-overerving erft niets. Wanneer een privétoegangsspecificatie wordt gebruikt, worden openbare en beschermde leden van de basisklasse ook privé.
Beschermde erfenis
Algemene syntaxis
waarmee xml-bestanden worden geopend
Wanneer een beschermde toegangsspecificatie wordt gebruikt, worden openbare en beschermde leden van de basisklasse beschermde leden in de afgeleide klasse.
Merk op dat wanneer we private access-specificatie gebruiken voor de basisklasse, geen van de basisklasse-leden wordt geërfd. Ze worden allemaal privé in de afgeleide klasse.
Hieronder vindt u de weergave in tabelvorm van alle toegangsmodi en hun interpretatie voor overerving.
Afgeleide klasse -> Basisklasse | Privaat | Openbaar | Beschermd |
---|---|---|---|
Privaat | Niet geërfd | Niet overgenomen | Niet overgenomen |
Openbaar | Privaat | Openbaar | Beschermd |
Beschermd | Privaat | Beschermd | Beschermd |
Orde van constructeurs / vernietigers in erfenis
Wanneer klassen worden overgeërfd, worden de constructors aangeroepen in dezelfde volgorde als de klassen worden overgeërfd. Als we een basisklasse en een afgeleide klasse hebben die deze basisklasse erft, dan zal de basisklasse-constructor (standaard of geparametriseerd) eerst worden aangeroepen, gevolgd door de afgeleide klasse-constructor.
Het volgende programma toont de volgorde van constructors in overerving. We hebben een basisklasse 'Base' die een standaard constructor en een constructor met parameters heeft. We leiden hieruit een klasse af genaamd 'Derived' die ook een standaard en een andere geparameteriseerde constructor heeft.
De uitvoer van dit programma toont de volgorde waarin de constructors worden aangeroepen.
Uitgang:
Standaard constructor van de basisklasse
Standaard constructor van de basisklasse
Afgeleide klasse standaard constructor
Constructor met parameters voor basisklasse
Afgeleide klasse geparameteriseerde constructor
We zien dat we na het maken van het basisklasseobject een afgeleid klasseobject maken met een standaardconstructor. Wanneer dit object wordt gemaakt, wordt eerst de standaardconstructor van de basisklasse aangeroepen en vervolgens wordt de afgeleide klasseconstructor uitgevoerd.
Evenzo, wanneer het afgeleide klasseobject wordt gemaakt met behulp van de geparameteriseerde constructor, wordt de basisklasse geparameteriseerde constructor eerst aangeroepen en vervolgens wordt de afgeleide klasse constructor aangeroepen.
Merk op dat als er geen constructor met parameters in de basisklasse was, de standaardconstructor zou zijn aangeroepen, zelfs voor het construeren van het afgeleide klasseobject met parameters.
Maar de vraag blijft waarom de constructor van de basisklasse wordt aangeroepen tijdens het construeren van de afgeleide klasseobjecten?
We weten dat een constructor wordt gebruikt om objecten van de klasse te maken en ook om de leden van de klasse te initialiseren. Wanneer het afgeleide klasseobject is gemaakt, heeft de constructor ervan alleen controle over de afgeleide klassenleden.
De afgeleide klasse erft echter ook de leden van de basisklasse. Als alleen de constructor van de afgeleide klasse werd aangeroepen, zouden de leden van de basisklasse die door de afgeleide klasse zijn geërfd, niet correct worden geïnitialiseerd.
Als gevolg hiervan wordt niet het hele object efficiënt gemaakt. Dit is de reden waarom alle basisklasse-constructors als eerste worden aangeroepen wanneer een afgeleid klasseobject wordt gemaakt.
Soorten erfenis
Afhankelijk van de manier waarop de klasse is afgeleid of hoeveel basisklassen een klasse erft, hebben we de volgende soorten overerving, zoals weergegeven in de onderstaande afbeelding.
We zullen elk van deze typen onderzoeken in onze volgende tutorial over 'Soorten overerving'.
Sjabloonovererving
Als onze implementatie sjablonen omvat, dan moeten we sjabloonklassen erven of ontlenen, en we maken daar gebruik van sjabloonovererving.
Laten we direct naar een programmeervoorbeeld gaan om de overerving beter te begrijpen met behulp van sjablonen.
Uitgang:
basecls_Template obj = 100
afgeleidcls_Child obj1 (overgenomen van basecls_Template = A
In het bovenstaande programma hebben we een sjabloon met de naam basecls_Template die de klassensjabloon voor de basisklasse definieert. Vervolgens definiëren we een klasse afgeleidcls_Child die we willen afleiden uit een sjabloonklasse.
Maar merk op dat de klasse basecls_Template alleen een type is en geen klasse. Daarom kunnen we de klasse afgeleidcls_Child niet afleiden uit deze sjabloon.
Dus als we de kinderklasse aangeven als:
Dit leidt tot een fout. De reden dat basecls_Template is, is een gegevenstype en niet een klasse. Dus om de leden van basecls_Template te erven, moeten we het eerst instantiëren voordat we ervan afleiden.
Daarom de bovenstaande verklaring, Klasse afgeleidcls_Child: openbare basecls_Template werkt prima.
In deze verklaring hebben we de sjabloon basecls_Template geïnstantieerd in een tekenklasse-sjabloon. Zodra we deze geïnstantieerde sjabloonklasse gebruiken, vallen de andere dingen die daarop volgen, zoals het maken en gebruiken van objecten, samen met het gebruikelijke overervingswerk.
Samenstelling
Tot nu toe hebben we alles gezien over erfelijkheidsrelaties. Overerving geeft in feite het soort relaties weer waarin de relatie een onderdeel aangeeft. Bijvoorbeeld, een slang is een soort reptiel. We kunnen ook zeggen dat Reptile deel uitmaakt van Animal class.
Concluderend geeft overerving aan 'IS EEN' soort relaties waarin we kunnen zeggen dat de afgeleide klasse een onderdeel is van de basisklasse.
We kunnen ook relaties als geheel vertegenwoordigen. Bijvoorbeeld, als we zeggen dat de salarisklasse een onderdeel is van de werknemersklasse, dan geven we deze niet correct weer. We weten dat werknemers een salaris hebben. Het is dus handiger om te zeggen 'Werknemer heeft salaris'.
Evenzo, als we de klasse Voertuigen als voorbeeld nemen, kunnen we zeggen dat Voertuig heeft motor of Voertuig heeft chassis. Al deze relaties verbeelden dus 'HEEFT EEN' relaties die een heel object in een andere klasse vertegenwoordigen. Dit wordt gedefinieerd als Samenstelling
Relaties die door compositie worden weergegeven, zijn van elkaar afhankelijk. Bijvoorbeeld, een chassis kan niet bestaan zonder een voertuig. Evenzo kan salaris niet bestaan zonder een werknemer.
We kunnen de compositie schematisch weergeven zoals hieronder weergegeven:
De compositie wordt ook wel Containment genoemd. In de bovenstaande weergave hebben we een bovenliggende klasse getoond. In tegenstelling tot overerving nemen we een kindklasseobject op in de bovenliggende klasse. Dit is insluiting of compositie.
hoe u .eps-bestanden opent in Windows 10
Laten we een programmeervoorbeeld nemen om dit te begrijpen.
Uitgang:
10001 Ved
A-101 Silver Springs Aundh Pune Maharashtra
In dit voorbeeld hebben we een bovenliggende klasse Werknemer en een onderliggende klasse Adres. Binnen de bovenliggende klasse Employee hebben we een pointer naar de Address-klasse gedeclareerd en initialiseren we dit object ook in de Employee-constructor. Zo geven we de relatie weer dat de werknemer een adres heeft dat is samengesteld.
Hoe moeten we beslissen tussen samenstelling en overerving?
Samenstelling en overerving geven beide de relaties tussen klassen weer. Terwijl overerving de 'IS-A' -relatie weergeeft, toont de compositie de 'HAS-A' -relatie.
Nu is de vraag: wanneer moeten we overerving gebruiken en wanneer moeten we compositie gebruiken? Eigenlijk kunnen we niet beslissen over de exacte situaties waarin we een van beide zouden moeten gebruiken. Dit komt omdat elk zijn eigen voor- en nadelen heeft.
Beide bevorderen de herbruikbaarheid van code. Overerving kan code omvangrijk maken naarmate de oplossingen complex worden, maar het stelt ons tegelijkertijd ook in staat om de bestaande code uit te breiden. We zouden dus overerving moeten gebruiken als het onze vereiste is om de eigenschappen en methode van een andere klasse binnen de nieuwe klasse te wijzigen en te gebruiken.
Met andere woorden, wanneer we meer eigenschappen willen toevoegen en de bestaande klasse willen uitbreiden. Aan de andere kant, als we de eigenschappen en het gedrag van een andere klasse niet willen wijzigen, maar het gewoon binnen de klas willen gebruiken, gaan we voor compositie.
De beste beslissing is dus of compositie of overerving wordt gebruikt door de voor- en nadelen van beide technieken voor de specifieke situatie af te wegen.
Gevolgtrekking
Zo zijn we aan het einde gekomen van ons onderwerp over erfenis. We hebben verschillende manieren van overerving gezien. We hebben ook de soorten overerving gezien, die we in onze volgende tutorial zullen onderzoeken. We hebben geleerd over de volgorde van constructors die worden uitgevoerd in geval van overerving.
We hebben ook gestudeerd over sjablonen en overerving. We moeten een sjabloon instantiëren voordat we het in overerving kunnen gebruiken, aangezien de sjabloon zelf een gegevenstype is en we niet kunnen erven van een gegevenstype.
De compositie is een ander type klassenrelatie en we moeten eerst de exacte situatie kennen en alleen dan kunnen we beslissen of we compositie of overerving gebruiken.
In onze aanstaande tutorial zullen we meer zien over de soorten overerving.
Bekijk hier de eenvoudige C ++ trainingsserie.
Aanbevolen literatuur
- Soorten overerving in C ++
- Runtime-polymorfisme in C ++
- Vriendfuncties in C ++
- Gebruik van Selenium Selecteer klasse voor het omgaan met vervolgkeuzelijsten op een webpagina - Selenium-zelfstudie # 13
- Klassen en objecten in C ++
- Statisch in C ++
- Unix Pipes-zelfstudie: Pipes in Unix-programmering
- Java-interface en abstracte les met voorbeelden