C ++ er et objektorienteret sprog. Dataabstraktion, polymorfisme, indkapsling og arv er hjørnestenene i OOP. I dette indlæg vil vi forstå, hvad der er arv? Typer af arv i C ++ og alle de nødvendige begreber relateret til det fra bunden. I sidste ende vil vi også se på ulempen ved dette kraftfulde koncept og forsøge at løse det.
- Hvad er arv i C ++
- Enkelt arv
- Multilevel arv
- Hierarkisk arv
- Flere arv i C ++
- Hybrid arv i C ++
- Diamantproblemet
Hvad er arv i C ++
Arv er et af de mest kraftfulde og udbredte begreber i C ++ eller ethvert andet objektorienteret sprog. At forstå dette koncept kræver lidt viden om klasser og objekter. Ved hjælp af arv kan vi oprette en klasse, der består af generelle metoder og attributter. Denne klasse kan arves af andre klasser, der indeholder mere specifikke metoder.
Ved at gøre dette behøver vi ikke skrive de samme funktioner igen og igen, hvilket sparer tid og øger læsbarheden af kode.
Syntaks:
klasse afledt_klasse: adgangstype base_klasse {// klassekrop}
Basis klasse: Klassen, der består af alle de generelle metoder og attributter, som kan deles af andre klasser for at øge kodelæsbarheden kaldes en basisklasse.
Afledt klasse: Klassen, der består af mere specifikke metoder og arver en klasse, kaldes en afledt klasse. En afledt klasse kan også være en basisklasse for en anden afledt klasse.
Hvis vi opretter en klasse XYZ med nogle attributter og metoder. Nu vil en klassestudent have nogle andre attributter, men det inkluderer også elementerne i XYZ-klassen, og det samme gælder for en fakultetsklasse. Lad os se et diagram:
Så den studerende og fakultetsklasse arver fra XYZ.
Adgangsspecifikator- Vi forstod, hvordan en klasse kan arve en anden klasse. Men nogle mennesker siger måske, at det er en usikker metode, da alle attributter og metoder i basisklassen eller forældreklassen deles med barneklassen eller den afledte klasse. For eksempel, hvis en klasse 'Bank' arves af klassen 'kunder' og 'investorer'. Attributter i klasse 'Bank' såsom 'vaultpassword', anden kunde-relateret information og private data deles med 'kunder' og 'investor' -klassen, som er usikker.
For at løse ovenstående problem bruger C ++ adgangsspecifikatorer til at begrænse adgangen til attributterne til baseklassen til den afledte klasse. Der er i alt 3 typer adgangsspecifikatorer i C ++
- Offentlig
- Privat
- Beskyttet
Nedenstående tabel giver dig en god forståelse af, hvilken type data der kan tilgås af afledt klasse i henhold til forskellige adgangsspecifikatorer.
forskellen mellem forlængere og redskaber
Adgangsspecifikator | Offentlige data | Private data | Beskyttede data |
Privat | Ikke arvet | Ikke arvet | Ikke arvet |
Beskyttet | Beskyttet | Privat | Beskyttet |
Offentlig | Offentlig | Privat | Beskyttet |
Enkelt arv
Enkelt arv kan betragtes som den almindelige vaniljeform af arv. I en enkelt arv arver en enkelt klasse fra en 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<Dette tilfælde af arv kaldes som Multilevel arv. Klassen mellem den første og den sidste klasse er også kendt som en mellemliggende basisklasse.Hvad tror du, kan den sidste klasse arve medlemmer af første klasse? Ja den kan #include ved hjælp af namespace std-klasse Først {beskyttet: int en offentlig: ugyldig getinfofirst (int x) {a = x} ugyldig showinfofirst () {std :: cout<< 'Value of a = ' <Produktion:
Værdien af a = 10
Værdien af b = 20
Værdien af c = 30
Værdien af d = 50
Hierarkisk arv
Visse problemer kan ikke løses ved hjælp af en enkelt arv eller flere niveauer. I hierarkisk arv arver mere end 1 klasse fra en enkelt baseklasse.
#include ved hjælp af namespace std klasse 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 }Produktion:
Vi er i klasse College
Vi er i klasse College
Flere arv i C ++
Vi så i hierarkisk arv, at en basisklasse havde mere end en afledt klasse. I flere arv har en afledt klasse mere end en basisklasse.
#include ved hjælp af namespace std klasse Én {beskyttet: int en offentlig: ugyldig getinfoOne (int x) {a = x}} klasse to {beskyttet: int b offentlig: ugyldig getinfoTwo (int y) {b = y}} klasse Hoved: public One, public Two {public: void Display () {std :: cout<< 'Value of a = ' < På dette tidspunkt har vi en god forståelse af alle typer arv, der bruges i C ++. Men vent hvad hvis vi vil bruge 2 forskellige typer arv? Er det muligt? Ja, det er muligt ved hjælp af hybrid arv. I hybrid arv kombinerer vi 2 forskellige typer arv. For eksempel- Multilevel og multipel arv, Hierarkisk og multipel arv osv.#include ved hjælp af namespace std klasse Verden {beskyttet: int en offentlig: ugyldig getinfoWorld (int x) {a = x}} klasse Kontinent: offentlig verden {beskyttet: int b offentlig: ugyldig getinfoContinent (int y) {b = y}} klasse Land {beskyttet: int d offentligt: ugyldigt getinfoCountry (int m) {d = m}} klasse Australien: offentligt kontinent, offentligt land {offentligt: ugyldigt Display () {std :: cout<< 'Value of a = ' <Lad os forstå ovenstående diagram, som vil hjælpe os med at forstå diamantproblemet. klasse B og klasse C arver fra klasse A, derfor har både klasse A og klasse B attributter og metoder i klasse A. hvis klasse D arver fra klasse B såvel som klasse C. klasse D har alle attributterne i klasse B og klasse C Det har også alle attributterne i klasse A nedarvet fra klasse B såvel som klasse C. Derfor, hvis vi laver et objekt i klasse D og kalder en metode i klasse A., oprettes en tvetydig situation, og kompilatoren vil blive forvirret fra hvor det skal klassemetode A, fra klasse B eller klasse D.
For at løse denne tvetydighed bruger vi et koncept kaldet den virtuelle baseklasse. Når vi laver en basisklasse, bliver en virtuel baseklasse kun en kopi af denne klasse nedarvet uanset antallet af eksisterende stier mellem den virtuelle baseklasse og en afledt klasse.
klasse A {} klasse B: virtuel offentlig A {} klasse C: virtuel offentlig A {} klasse D: offentlig C, offentlig D {}Med dette kommer vi til en ende af denne arv i C ++ - artiklen. Hvis du ønsker at lære mere, skal du tjekke af Edureka, et pålideligt online læringsfirma. Edurekas Java J2EE- og SOA-uddannelses- og certificeringskursus er designet til at træne dig til både kerne- og avancerede Java-koncepter sammen med forskellige Java-rammer som Hibernate & Spring.
Har du et spørgsmål til os? Nævn det i kommentarsektionen på denne blog, og vi vender tilbage til dig hurtigst muligt.