Alles wat u moet weten over overerving in C ++



Dit artikel biedt u een gedetailleerde en uitgebreide kennis van Inheritance in C ++, de verschillende typen ervan en hoe u deze kunt implementeren.

C ++ is een objectgeoriënteerde taal. Data-abstractie, polymorfisme, inkapseling en overerving zijn de hoekstenen van OOP. In dit bericht zullen we begrijpen wat erfenis is? Typen overerving in C ++ en alle noodzakelijke concepten die er vanaf het begin mee te maken hebben. Uiteindelijk gaan we ook kijken naar de keerzijde van dit krachtige concept en proberen het op te lossen.

Wat is overerving in C ++

Overerving is een van de krachtigste en meest gebruikte concepten in C ++ of een andere objectgeoriënteerde taal. Om dit concept te begrijpen, is enige kennis van klassen en objecten vereist. Met Inheritance kunnen we een klasse maken die bestaat uit algemene methoden en attributen. Deze klasse kan worden overgenomen door andere klassen die meer specifieke methoden bevatten.





Overerving in C ++

Hierdoor hoeven we niet steeds dezelfde functionaliteiten te schrijven wat tijd bespaart en de leesbaarheid van code vergroot.



Syntaxis:

klasse afgeleid_klasse: access_type basis_klasse {// class body}

Basisklasse: De klasse die bestaat uit alle algemene methoden en attributen die door andere klassen kunnen worden gedeeld om de leesbaarheid van de code te vergroten, wordt een basisklasse genoemd.

Afgeleide klasse: De klasse die uit meer specifieke methoden bestaat en een klasse erft, wordt een afgeleide klasse genoemd. Een afgeleide klasse kan ook een basisklasse zijn voor een andere afgeleide klasse.



Als we een klasse XYZ maken, met enkele attributen en methoden. Nu heeft een klasstudent een aantal andere attributen, maar het zal ook de elementen van de XYZ-klas bevatten en hetzelfde geldt voor een facultaire klas. Laten we een diagram bekijken:

De klas van de student en de faculteit erven dus van XYZ.

wat is een instantievariabele

Toegangsspecificatie We begrepen hoe een klasse een andere klasse kan erven. Maar sommige mensen zullen misschien zeggen dat het een onveilige methode is, aangezien alle attributen en methoden van de basisklasse of de bovenliggende klasse worden gedeeld met de onderliggende klasse of de afgeleide klasse. Als een klasse ‘Bank’ bijvoorbeeld wordt geërfd door de klasse ‘klanten’ en ‘investeerders’. Kenmerken van de klasse ‘Bank’, zoals ‘kluiswachtwoord’, andere klantgerelateerde informatie en privégegevens, worden gedeeld met de ‘klanten’ en de ‘investeerders’, die onveilig zijn.

Om het bovenstaande probleem op te lossen, gebruikt C ++ toegangsspecificaties om de toegang van basisklasseattributen tot de afgeleide klasse te beperken. Er zijn in totaal 3 soorten toegangsspecificaties in C ++

  1. Openbaar
  2. Privaat
  3. Beschermd

De onderstaande tabel geeft u een goed begrip van welk type gegevens toegankelijk zijn voor afgeleide klassen volgens verschillende toegangsspecificaties.

Toegang tot Specifier Openbare gegevens Privégegevens Beschermde gegevens
Privaat Niet overgenomenNiet overgenomenNiet overgenomen
Beschermd Beschermd Privaat Beschermd
Openbaar Openbaar Privaat Beschermd

Enkele erfenis

Single Inheritance kan worden beschouwd als de gewone vanille-vorm van overerving. Bij enkele overerving erft een enkele klasse van een basisklasse.

#include using namespace std class Train {int Numberofwheels int Numberofcoaches public: void Traininfo (int n, int m) {Numberofwheels = n Numberofcoaches = m} void showinfo () {cout<Dit geval van overerving wordt overerving op meerdere niveaus genoemd. De klasse tussen de eerste en de laatste klasse wordt ook wel een tussenliggende basisklasse genoemd.Wat denk je, kan de laatste klas leden van de eerste klas erven? Ja het kan

#include using namespace std class First {protected: int a public: void getinfofirst (int x) {a = x} void showinfofirst () {std :: cout<< 'Value of a = ' < 

Uitgang:

Waarde van a = 10

Waarde van b = 20

Waarde van c = 30

Waarde van d = 50

Hiërarchische overerving

Bepaalde problemen kunnen niet worden opgelost met behulp van overerving op één of meerdere niveaus. Bij hiërarchische overerving erven meer dan 1 klasse van een enkele basisklasse.

#inclusief het gebruik van de naamruimte std class College {public: College () {cout<< 'We are in class College' << endl } } class Student: public College { } class Faculty: public College { } int main() { Student student Faculty faculty return 0 }

Uitgang:

We zitten in klas College

We zitten in klas College

Meerdere overerving in C ++

We zagen in hiërarchische overerving dat één basisklasse meer dan één afgeleide klasse had. Bij meervoudige overerving heeft één afgeleide klasse meer dan één basisklasse.

#include using namespace std class One {protected: int a public: void getinfoOne (int x) {a = x}} class Two {protected: int b public: void getinfoTwo (int y) {b = y}} class Main: public One, public Two {public: void Display () {std :: cout<< 'Value of a = ' < Op dit moment hebben we een goed begrip van alle soorten overerving die in C ++ worden gebruikt. Maar wacht wat als we 2 verschillende soorten overerving willen gebruiken? Is dit mogelijk? Ja, het is mogelijk met behulp van hybride overerving. Bij hybride overerving combineren we 2 verschillende soorten overerving. Bijvoorbeeld: Overerving op meerdere niveaus en meerdere, hiërarchische en meervoudige overerving, enz.

#include using namespace std class World {protected: int a public: void getinfoWorld (int x) {a = x}} class Continent: public World {protected: int b public: void getinfoContinent (int y) {b = y}} class Country {protected: int d public: void getinfoCountry (int m) {d = m}} class Australia: public Continent, public Country {public: void Display () {std :: cout<< 'Value of a = ' < 

Laten we het bovenstaande diagram begrijpen, dat ons zal helpen het diamantprobleem te begrijpen. klasse B en klasse C erft van klasse A, dus zowel klasse A als klasse B hebben attributen en methoden van klasse A. als klasse D zowel van klasse B als klasse C erft, heeft klasse D alle attributen van klasse B en klasse C Het heeft ook alle attributen van klasse A geërfd van klasse B en klasse C. dus als we een object van klasse D maken en een methode van klasse A aanroepen, wordt er een dubbelzinnige situatie gecreëerd en wordt de compiler in de war gebracht van waar het zou methode van A moeten classificeren, van klasse B of klasse D.

Om deze dubbelzinnigheid op te lossen, gebruiken we een concept genaamd de virtuele basisklasse. Wanneer we van een basisklasse een virtuele basisklasse maken, wordt slechts één kopie van die klasse overgeërfd, ongeacht het aantal bestaande paden tussen de virtuele basisklasse en een afgeleide klasse.

class A {} class B: virtual public A {} class C: virtual public A {} class D: public C, public D {}

Hiermee komen we aan het einde van dit Inheritance in C ++ -artikel. Als je meer wilt weten, bekijk dan de door Edureka, een vertrouwd online leerbedrijf. Edureka's Java J2EE- en SOA-trainings- en certificeringscursus is ontworpen om u te trainen in zowel kern- als geavanceerde Java-concepten, samen met verschillende Java-frameworks zoals Hibernate & Spring.

Heeft u een vraag voor ons? Vermeld het in het opmerkingengedeelte van deze blog en we nemen zo snel mogelijk contact met je op.