inheritance c
Pomen dedovanja v jeziku C ++ s primeri:
Dedovanje je ena najpomembnejših lastnosti objektno usmerjenega programiranja.
Dedovanje je tehnika, s katero en razred pridobi lastnosti in metode drugega razreda. Tako lahko ponovno uporabimo že napisano in preverjeno kodo. Razred, ki pridobi lastnosti drugega razreda, se imenuje podrazred ali izpeljani razred ali podrejeni razred.
Razred, katerega lastnosti so pridobljene, se imenuje osnovni razred ali nadrejeni razred ali superrazred. Ko en razred pridobi ali podeduje drug razred, so za izpeljani razred na voljo vse lastnosti in metode osnovnega razreda, tako da lahko to kodo ponovno uporabimo.
=> Obiščite tukaj, če se želite naučiti C ++ iz nič.
youtube v mp3, daljši od 90 minut
Kaj se boste naučili:
- Zakaj potrebujemo dedovanje?
- Načini dedovanja
- Vrstni red konstruktorjev / destruktorjev v dedovanje
- Vrste dedovanja
- Dedovanje predloge
- Sestava
- Kako naj se odločimo med sestavo in dedovanjem?
- Zaključek
- Priporočeno branje
Zakaj potrebujemo dedovanje?
Razmislite o skupini vozil, kot so avto, avtobus, džip itd. Vsako od teh vozil bo imelo lastnosti in metode, kot je navedeno v spodnjem diagramu.
Če moramo za zgornja vozila izvesti posamezne razrede, lahko vidimo, da bomo morali v vse tri razrede napisati isto kodo, saj imajo vsi trije tipi vozil bolj ali manj enake lastnosti. Zaradi tega bo naš program neučinkovit in okoren, saj bo na voljo veliko podvojenih kod.
Namesto da podpišemo podvojeno kodo kot zgoraj, lahko uporabimo funkcijo dedovanja, da preprečimo podvajanje kode, prav tako pa napišemo en kos kode in jo uporabimo v vseh treh razredih. To je slikovno predstavljeno kot spodaj.
Na zgornji sliki smo opredelili osnovni razred 'Vozila' in iz tega razreda izpeljali razrede Car, Bus in Jeep. Skupne metode in lastnosti so zdaj del razreda Vozila. Ker so drugi razredi izpeljani iz razreda Vozila, vsi razredi pridobijo te metode in lastnosti.
Zato moramo preprosto napisati skupno kodo samo enkrat in vse tri razrede; Avto, avtobus in džip ga bodo pridobili.
Tako je glavna prednost, ki jo dobimo z dedovanjem obstoječih razredov ali oblikovanjem mehanizma dedovanja, ponovna uporaba kode.
Nadaljnje branje = >> Vadnica za dedovanje Java
Splošna oblika za dedovanje razreda je:
class derived_classname: access_specifier base_classname { };
Tukaj izpeljano_razred 'Je ime izpeljanega razreda,' dostop_specifikator 'Je način dostopa, tj. Javni, zaščiteni ali zasebni, v katerem mora izpeljani razred podedovati osnovni razred in' izpeljano_razred 'Je ime osnovnega razreda, iz katerega podeduje izpeljani razred.
Načini dedovanja
'Access_specifier', prikazan v zgornji izjavi o dedovanju, ima lahko svoje vrednosti, kot je prikazano spodaj.
Glede na podatek access_specifier, ki smo ga podedovali, ko podedujemo razred, imamo različne načine dedovanja, kot so navedeni spodaj.
Javno dedovanje
Splošna skladnja
class sub_class : public parent_class
Ko je podan specifikator javnega dostopa, se javni člani osnovnega razreda podedujejo kot javni, zaščiteni člani pa so zaščiteni. Zasebni člani ostanejo zasebni. To je najbolj priljubljen način dedovanja.
Zasebno dedovanje
Splošna sintaksa
class sub_class : parent_class
Zasebno dedovanje ne podeduje ničesar. Ko se uporabi specifikator zasebnega dostopa, postanejo zasebni tudi javni in zaščiteni člani osnovnega razreda.
Zaščitena dediščina
Splošna sintaksa
class sub_class:protected parent_class
Ko se uporabi specifikator zaščitenega dostopa, javni in zaščiteni člani osnovnega razreda postanejo zaščiteni člani v izvedenem razredu.
Upoštevajte, da ko za osnovni razred uporabimo specifikator zasebnega dostopa, noben član osnovnega razreda ni podedovan. Vsi postanejo zasebni v izpeljanem razredu.
Spodaj je tabelarizirana predstavitev vseh načinov dostopa in njihova interpretacija za dedovanje.
Izpeljani razred -> Osnovni razred | Zasebno | Javno | Zaščiteno |
---|---|---|---|
Zasebno | Ni podedovano | Ni podedovano | Ni podedovano |
Javno | Zasebno | Javno | Zaščiteno |
Zaščiteno | Zasebno | Zaščiteno | Zaščiteno |
Vrstni red konstruktorjev / destruktorjev v dedovanje
Ko so razredi podedovani, se konstruktorji pokličejo v enakem vrstnem redu kot podedovani razredi. Če imamo osnovni razred in en izpeljani razred, ki podeduje ta osnovni razred, bo konstruktor osnovnega razreda (naj bo privzeti ali parametriziran) najprej poklican, nato pa izpeljani konstruktor razreda.
Naslednji program prikazuje vrstni red konstruktorjev pri dedovanju. Imamo osnovni razred 'Base', ki ima privzeti konstruktor in parametrizirani konstruktor. Iz tega izpeljemo razred, imenovan 'Izpeljano', ki ima prav tako en privzeti in drugega parametriziranega konstruktorja.
Rezultat tega programa prikazuje vrstni red klica konstruktorjev.
#include using namespace std; //order of execution of constructors in inheritance class Base { int x; public: // default constructor Base() { cout Izhod:
Privzeti konstruktor osnovnega razreda
Privzeti konstruktor osnovnega razreda
Izvedeni privzeti konstruktor razreda
Parametrizirani konstruktor osnovnega razreda
Izpeljani parametarski konstruktor razreda
Vidimo, da po izdelavi predmeta osnovnega razreda ustvarimo objekt izpeljanega razreda s privzetim konstruktorjem. Ko je ta objekt ustvarjen, se najprej pokliče privzeti konstruktor osnovnega razreda in nato izvede izvedeni konstruktor razreda.
Podobno se pri izdelavi izpeljanega predmeta razreda z uporabo parametriziranega konstruktorja najprej pokliče parametrizirani konstruktor osnovnega razreda, nato pa konstruktor izpeljanega razreda.
Upoštevajte, da če v osnovnem razredu ne bi bilo parametriziranega konstruktorja, bi bil privzeti konstruktor poklican celo za izdelavo parametriziranega izvedenega predmeta razreda.
Vendar ostaja vprašanje, zakaj se pri konstruiranju izpeljanih predmetov razreda pokliče konstruktor osnovnega razreda?
Vemo, da se s konstruktorjem ustvarjajo predmeti razreda in tudi inicializirajo člani razreda. Ko je ustvarjen objekt izpeljanega razreda, ima njegov konstruktor nadzor samo nad izpeljanimi člani razreda.
programsko opremo za prenos videoposnetkov s katerega koli spletnega mesta
Izpeljani razred pa podeduje tudi člane osnovnega razreda. Če bi bil poklican samo konstruktor izpeljanega razreda, potem člani osnovnega razreda, ki jih je podedoval izpeljani razred, ne bi bili pravilno inicializirani.
Posledično celotni objekt ne bo ustvarjen učinkovito. To je razlog, zaradi katerega se najprej pokličejo vsi konstruktorji osnovnega razreda, ko se ustvari izpeljani objekt razreda.
Vrste dedovanja
Glede na način izpeljave razreda ali koliko osnovnih razredov podeduje razred, imamo naslednje vrste dedovanja, kot je prikazano na spodnji sliki.
Vsako od teh vrst bomo raziskali v naslednji vadnici o „Vrste dedovanja“.
Dedovanje predloge
Kadar naša izvedba vključuje predloge, moramo podedovati ali izpeljati iz razredov predlog in tam uporabimo dedovanje predloge.
Pojdimo neposredno na primer programiranja, da bomo bolje razumeli dedovanje z uporabo predlog.
#include using namespace std; //template inhertance templateclass basecls_Template { public: T value; basecls_Template(T value) { this->value = value; } void displayVal() { cout << value << endl; } }; //derived class inherits basecls_Template class derivedcls_Child : public basecls_Template { public: derivedcls_Child(/* no parameters */): basecls_Template( 0 ){ // default char is NULL; } derivedcls_Child(char c): basecls_Template( c ) { ; } void displayVal_drvd() { displayVal(); } }; int main() { basecls_Template obj( 100 ); derivedcls_Child obj1( 'A' ); cout<<'basecls_Template obj = '; obj.displayVal(); // should print '100' cout< Izhod:
basecls_Template obj = 100
izpeljanocls_Child obj1 (podedovano od basecls_Template = A
V zgornjem programu imamo predlogo z imenom basecls_Template, ki definira predlogo razreda za osnovni razred. Nato definiramo razred, ki je izpeljan iz cls_Child, ki ga želimo izpeljati iz razreda predloge.
Upoštevajte pa, da je razred basecls_Template samo tip in ne razred. Iz te predloge torej ne moremo izpeljati razreda, ki je izpeljan iz cls_Child.
Če torej razglasimo podrejeni razred kot:
class derivedcls_Child : public basecls_Template
To bo povzročilo napako. Razlog, da je basecls_Template, je podatkovni tip in ne razred. Da bi podedovali člane basecls_Template, bi ga morali najprej instantirati, preden iz njega izhajamo.
Zato zgornja izjava, Izvedeni razredcls_Child: public basecls_Template deluje v redu.
V tej izjavi smo predlogo basecls_Template postavili v predlogo razreda znakov. Ko enkrat uporabimo ta razred primerne predloge, druge stvari, ki sledijo ustvarjanju in uporabi predmetov, sovpadajo z običajnim delovanjem dedovanja.
Sestava
Doslej smo videli vse o dednih odnosih. Dedovanje v bistvu prikazuje vrsto odnosov, v katerih odnos označuje del. Na primer, kača je nekakšen plazilec. Lahko rečemo tudi, da je plazilec del razreda živali.
Kot zaključek dedovanje kaže 'JE' vrste odnosov, pri katerih lahko rečemo, da je izpeljani razred del osnovnega razreda.
Lahko predstavljamo tudi odnose kot celoto. Na primer, če rečemo, da je razred plač del razreda zaposlenega, ga ne predstavljamo pravilno. Vemo, da imajo zaposleni plačo. Tako je bolj priročno reči 'Zaposleni ima plačo'.
Podobno, če za primer vzamemo razred Vozila, lahko rečemo, da ima Vozilo motor ali Vozilo ima podvozje. Tako so prikazani vsi ti odnosi 'IMA' razmerja, ki predstavljajo celoten objekt v drugem razredu. To je opredeljeno kot Sestava .
Odnosi, ki jih prikazuje kompozicija, so odvisni drug od drugega. Na primer, podvozje ne more obstajati brez vozila. Podobno tudi plača ne more obstajati brez zaposlenega.
Sestavo lahko shematsko predstavimo, kot je prikazano spodaj:
Sestava se imenuje tudi zadrževanje. V zgornji predstavitvi smo prikazali nadrejeni razred. V nasprotju z dedovanjem v nadrejeni razred vključimo objekt podrejenega razreda. To je zadrževanje ali sestava.
kako odpreti datoteke .swf
Vzemimo primer programiranja, da to razumemo.
#include using namespace std; //Composition example //Child class - address class Address { public: string houseNo, building, street, city, state; //Initialise the address object Address(string houseNo,string building,string street, string city, string state) { this->houseNo = houseNo; this->building = building; this->street = street; this->city = city; this->state = state; } }; //Parent class - Employee class Employee { private: Address* address; //composition->Employee has an address public: int empId; string empName; Employee(int empId, string empName, Address* address) { this->empId = empId; this->empName = empName; this->address = address; } void display() { cout< Izhod:
10001 Ved
A-101 Silver Springs Aundh Pune Maharashtra
V tem primeru imamo nadrejeni razred Employee in podrejeni naslov Naslov. Znotraj nadrejenega razreda Employee smo razglasili kazalec na razred Address in ta objekt tudi inicializirali v konstruktorju Employee. Tako prikazujemo odnos, ki ga ima zaposleni naslov, ki je sestava.
Kako naj se odločimo med sestavo in dedovanjem?
Sestava in dedovanje prikazujeta razmerja med razredi. Medtem ko dedovanje prikazuje odnos 'IS-A', kompozicija prikazuje odnos 'HAS-A'.
Zdaj je vprašanje, kdaj naj uporabimo dedovanje in kdaj sestavo? Pravzaprav se ne moremo natančno odločiti, kdaj naj uporabimo katero koli od njih. To pa zato, ker ima vsak svoje prednosti in slabosti.
Oba spodbujata ponovno uporabo kode. Dedovanje lahko naredi kodo zajetno, saj se rešitve zapletajo, hkrati pa nam omogoča tudi razširitev obstoječe kode. Tako bi morali uporabiti dedovanje, kadar je naša zahteva spremeniti in uporabiti lastnosti in metodo drugega razreda znotraj novega razreda.
Z drugimi besedami, ko želimo dodati več lastnosti in razširiti obstoječi razred. Po drugi strani pa, če ne želimo spreminjati lastnosti in vedenja drugega razreda, ampak ga preprosto uporabimo znotraj razreda, gremo za sestavo.
Tako je najboljša odločitev, ali bomo uporabili sestavo ali dedovanje, sprejeli s tehtanjem prednosti in slabosti obeh tehnik za določeno situacijo.
= >> Preberite tudi Sestava v Javi
Zaključek
Tako smo prišli do konca naše teme o dedovanju. Videli smo različne načine dedovanja. Videli smo tudi vrste dedovanja, ki jih bomo raziskali v naslednji vadnici. Spoznali smo vrstni red konstruktorjev, ki se izvajajo v primeru dedovanja.
Preučevali smo tudi predloge in dedovanje. Predlogo moramo primeriti, preden jo lahko uporabimo pri dedovanju, saj je sama predloga podatkovni tip in iz podatkovnega tipa ne moremo podedovati.
Sestava je druga vrsta razrednega odnosa in najprej moramo vedeti natančno situacijo, nato pa se samo mi lahko odločimo, ali bomo uporabili sestavo ali dedovanje.
V naši prihajajoči vadnici bomo videli več o vrstah dedovanja.
=> Tukaj bodite pozorni na preprosto vadbeno serijo C ++.
Priporočeno branje
- Vrste dedovanja v jeziku C ++
- Polimorfizem med izvajanjem v jeziku C ++
- Prijateljske funkcije v C ++
- Uporaba razreda selena za izbiro spustnih elementov na spletni strani - vadnica za selenij št. 13
- Razredi in predmeti v jeziku C ++
- Statično v C ++
- Vadnica za cevi Unix: Cevi v programiranju Unix
- Vadnica Java vmesnika in abstraktnega razreda s primeri