Tot ce trebuie să știți despre moștenire în C ++



Acest articol vă va oferi o cunoaștere detaliată și cuprinzătoare a Moștenirii în C ++, a diferitelor tipuri și a modului de implementare.

C ++ este un limbaj orientat pe obiecte. Abstracția datelor, polimorfismul, încapsularea și moștenirea sunt pietrele de temelie ale POO. În această postare, vom înțelege ce este moștenirea? Tipuri de moștenire în C ++ și toate conceptele necesare legate de aceasta de la zero. În cele din urmă, vom analiza și dezavantajul acestui concept puternic și vom încerca să îl rezolvăm.

Ce este Moștenirea în C ++

Moștenirea este unul dintre cele mai puternice și utilizate pe scară largă concepte în C ++ sau în orice alt limbaj orientat pe obiecte. Înțelegerea acestui concept necesită puțină cunoaștere a claselor și a obiectelor. Folosind Moștenire, putem crea o clasă care constă din metode și atribute generale. Această clasă poate fi moștenită de alte clase care conțin metode mai specifice.





Moștenirea în C ++

Făcând acest lucru, nu trebuie să scriem aceleași funcționalități din nou și din nou, ceea ce economisește timp și crește lizibilitatea codului.



Sintaxă:

clasă derivată_clasă: acces_tip bază_clasă {// corpul clasei}

Clasa de bază: Clasa care constă din toate metodele și atributele generale care pot fi partajate de alte clase pentru a crește lizibilitatea codului se numește clasă de bază.

Clasa derivată: Clasa care constă din metode mai specifice și moștenește o clasă se numește clasă derivată. O clasă derivată poate fi, de asemenea, o clasă de bază pentru o altă clasă derivată.



Dacă creăm o clasă XYZ, cu unele atribute și metode. Acum un elev de clasă va avea alte atribute, dar va include și elementele clasei XYZ și același lucru este valabil și pentru o clasă de facultate. Să vedem o diagramă:

Deci, studenții și facultatea vor moșteni de la XYZ.

Specificator de acces- Am înțeles cum o clasă poate moșteni o altă clasă. Dar unii oameni ar putea spune că este o metodă nesigură, deoarece toate atributele și metodele clasei de bază sau ale clasei părinte sunt împărtășite cu clasa copil sau clasa derivată. De exemplu, dacă o clasă „Bancă” este moștenită de clasa „clienți” și „investitori”. Atributele clasei „Bank”, cum ar fi „vaultpassword”, alte informații referitoare la clienți și date private, sunt partajate cu „clienții” și clasa „investitorilor”, ceea ce este nesigur.

Pentru a rezolva problema de mai sus, C ++ folosește specificatori de acces pentru a limita accesul atributelor clasei de bază la clasa derivată. Există un total de 3 tipuri de specificatori de acces în C ++

  1. Public
  2. Privat
  3. Protejat

Tabelul de mai jos vă va oferi o bună înțelegere a tipului de date care poate fi accesat de clasa derivată în funcție de diferiții specificatori de acces.

Specificator de acces Date publice Date private Date protejate
Privat Nu moștenitNu moștenitNu moștenit
Protejat Protejat Privat Protejat
Public Public Privat Protejat

Moștenirea unică

Moștenirea unică poate fi considerată ca forma simplă de moștenire vanilată. În moștenirea unică, o singură clasă moștenește dintr-o clasă de bază.

#include using namespace std class Train {int Numberofwheels int Numberofcoaches public: void Traininfo (int n, int m) {Numberofwheels = n Numberofcoaches = m} void showinfo () {cout<Acest caz de moștenire se numește moștenire pe mai multe niveluri. Clasa dintre prima și ultima clasă este, de asemenea, cunoscută sub numele de clasă de bază intermediară.Ce crezi, poate ultima moștenire să moștenească membrii primei clase? Da, se poate

#include folosirea spațiului de nume std class First {protected: int a public: void getinfofirst (int x) {a = x} void showinfofirst () {std :: cout<< 'Value of a = ' < 

Ieșire:

Valoarea a = 10

Valoarea lui b = 20

Valoarea c = 30

Valoarea d = 50

Moștenirea ierarhică

Anumite probleme nu pot fi rezolvate cu ajutorul moștenirii unice sau pe mai multe niveluri. În moștenirea ierarhică, mai mult de o clasă moștenesc dintr-o singură clasă de bază.

#include folosirea spațiului de nume clasa std Colegiu {public: Colegiu () {cout<< 'We are in class College' << endl } } class Student: public College { } class Faculty: public College { } int main() { Student student Faculty faculty return 0 }

Ieșire:

Suntem în clasa Colegiu

Suntem în clasa Colegiu

Moștenirea multiplă în C ++

Am văzut în moștenirea ierarhică o clasă de bază având mai multe clase derivate. În moștenirea multiplă, o clasă derivată are mai multe clase de bază.

#include folosirea spațiului de nume std clasa One {protected: int a public: void getinfoOne (int x) {a = x}} clasa Two {protected: int b public: void getinfoTwo (int y) {b = y}} clasă Principal: public One, public Two {public: void Display () {std :: cout<< 'Value of a = ' < În acest moment, avem o bună înțelegere a tuturor tipurilor de moștenire utilizate în C ++. Dar, așteptați dacă vrem să folosim 2 tipuri diferite de moștenire? Este posibil? Da, este posibil cu ajutorul Moștenirii hibride. În Moștenirea hibridă, combinăm 2 tipuri diferite de moștenire. De exemplu - Moștenirea multiplă și multiplă, moștenirea ierarhică și multiplă etc.

#include folosirea spațiului de nume std class World {protected: int a public: void getinfoWorld (int x) {a = x}} clasă Continent: public World {protected: int b public: void getinfoContinent (int y) {b = y}} clasa Country {protected: int d public: void getinfoCountry (int m) {d = m}} clasa Australia: public Continent, public Country {public: void Display () {std :: cout<< 'Value of a = ' < 

Să înțelegem diagrama de mai sus, care ne va ajuta să înțelegem problema diamantului. clasa B și clasa C moștenește din clasa A, deci atât clasa A cât și clasa B au atribute și metode ale clasei A. dacă clasa D moștenește din clasa B, precum și clasa C. clasa D va avea toate atributele clasei B și clasei C De asemenea, are toate atributele clasei A moștenite din clasa B, precum și din clasa C. prin urmare, dacă facem un obiect din clasa D și apelăm la o metodă din clasa A. se va crea o situație ambiguă și compilatorul va fi confundat de unde ar trebui să claseze metoda A, din clasa B sau clasa D.

Pentru a rezolva această ambiguitate folosim un concept numit clasa de bază virtuală. Când facem o clasă de bază o clasă de bază virtuală, se moștenește doar o copie a acelei clase, indiferent de numărul de căi existente între clasa de bază virtuală și o clasă derivată.

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

Cu aceasta, ajungem la sfârșitul acestei moșteniri în articolul C ++. Dacă doriți să aflați mai multe, consultați de Edureka, o companie de învățare online de încredere. Cursul de formare și certificare Java J2EE și SOA al Edureka este conceput pentru a vă instrui atât pentru conceptele Java de bază, cât și pentru cele avansate, împreună cu diverse cadre Java, cum ar fi Hibernate & Spring.

Ai o întrebare pentru noi? Vă rugăm să o menționați în secțiunea de comentarii a acestui blog și vă vom răspunde cât mai curând posibil.