inheritance c
Dôležitosť dedičnosti v C ++ s príkladmi:
Dedenie je jednou z najdôležitejších vlastností objektovo orientovaného programovania.
Dedenie je technika, ktorou jedna trieda získava vlastnosti a metódy druhej triedy. Takto môžeme znovu použiť kód, ktorý je už napísaný a overený. Trieda, ktorá nadobúda vlastnosti inej triedy, sa nazýva podtrieda alebo odvodená trieda alebo podradená trieda.
Trieda, ktorej vlastnosti sa získavajú, sa nazýva základná trieda alebo nadradená trieda alebo nadtrieda. Keď jedna trieda získa alebo zdedí inú triedu, potom sú pre odvodenú triedu k dispozícii všetky vlastnosti a metódy základnej triedy, aby sme tento kód mohli znova použiť.
=> Navštívte tu a dozviete sa C ++ od nuly.
otázky a odpovede na pohovor s analytikom kvality
Čo sa dozviete:
- Prečo potrebujeme dedičstvo?
- Režimy dedenia
- Poradie konštruktérov / ničiteľov v dedičstve
- Druhy dedenia
- Dedenie šablón
- Zloženie
- Ako by sme sa mali rozhodnúť medzi zložením a dedičstvom?
- Záver
- Odporúčané čítanie
Prečo potrebujeme dedičstvo?
Zvážte skupinu vozidiel, ako sú autá, autobusy, džípy, atď. Každé z týchto vozidiel bude mať vlastnosti a metódy uvedené v nasledujúcom diagrame.
Ak sa od nás vyžaduje zavedenie jednotlivých tried pre vyššie uvedené vozidlá, môžeme vidieť, že vo všetkých troch triedach budeme musieť napísať rovnaký kód, pretože všetky tri typy vozidiel vykazujú viac-menej rovnaké vlastnosti. Vďaka tomu bude náš program neefektívny a ťažkopádny, pretože bude existovať veľa duplicitných kódov.
Namiesto písania duplikovaného kódu, ako je uvedené vyššie, môžeme implementovať funkciu dedenia, aby sme zabránili duplikovaniu kódu, a tiež napísať jeden kúsok kódu a použiť ho vo všetkých troch triedach. Toto je obrazovo znázornené nižšie.
Na vyššie uvedenom obrázku sme definovali základnú triedu „Vozidlá“ a z tejto triedy odvodili triedy Car, Bus a Jeep. Bežné metódy a vlastnosti sú teraz súčasťou triedy Vozidlá. Pretože ďalšie triedy sú odvodené od triedy Vozidlá, všetky triedy získavajú tieto metódy a vlastnosti.
Spoločný kód teda musíme napísať iba raz a všetky tri triedy; Získajú ho spoločnosti Car, Bus a Jeep.
Hlavnou výhodou, ktorú získame dedením existujúcich tried alebo navrhnutím mechanizmu dedenia, je teda opätovná použiteľnosť kódu.
Ďalšie čítanie = >> Výukový program Java Inheritance
Všeobecný formát dedenia triedy je:
class derived_classname: access_specifier base_classname { };
Tu ' odvodená_trieda „Je názov odvodenej triedy,“ access_specifier „Je režim prístupu, t. J. Verejný, chránený alebo súkromný, v ktorom musí odvodená trieda dediť základnú triedu a„ odvodená_trieda ”Je názov základnej triedy, z ktorej dedí odvodená trieda.
Režimy dedenia
„Prístupový_špecifikátor“ zobrazený vo vyššie uvedenom vyhlásení o dedičstve môže mať svoje hodnoty, ako je uvedené nižšie.
V závislosti od zadaného parametra access_specifier, keď dedíme triedu, máme rôzne spôsoby dedenia, ako je uvedené nižšie.
Verejné dedičstvo
Všeobecná syntax
class sub_class : public parent_class
Keď je zadaný špecifikátor verejného prístupu, verejní členovia základnej triedy sa dedia ako verejné, zatiaľ čo chránení členovia sú chránení. Súkromní členovia zostávajú súkromní. Toto je najobľúbenejší spôsob dedenia.
Súkromné dedičstvo
Všeobecná syntax
class sub_class : parent_class
Súkromné dedičstvo nezdedí nič. Keď sa použije špecifikátor súkromného prístupu, verejní a chránení členovia základnej triedy sa tiež stanú súkromnými.
Chránené dedičstvo
Všeobecná syntax
class sub_class:protected parent_class
Keď sa použije špecifikátor chráneného prístupu, verejní a chránení členovia základnej triedy sa stanú chránenými členmi v odvodenej triede.
Upozorňujeme, že keď použijeme špecifikátor súkromného prístupu pre základnú triedu, nikto z členov základnej triedy sa nezdedí. Všetci sa stávajú súkromnými v odvodenej triede.
Ďalej je uvedená tabuľková reprezentácia všetkých režimov prístupu a ich interpretácia pre dedičstvo.
Odvodená trieda -> Základná trieda | Súkromné | Verejné | Chránené |
---|---|---|---|
Súkromné | Nededí sa | Nededí sa | Nededí sa |
Verejné | Súkromné | Verejné | Chránené |
Chránené | Súkromné | Chránené | Chránené |
Poradie konštruktérov / ničiteľov v dedičstve
Keď sa triedy dedia, konštruktory sa volajú v rovnakom poradí ako sa dedia triedy. Ak máme základnú triedu a jednu odvodenú triedu, ktorá dedí túto základnú triedu, potom sa najskôr zavolá konštruktor základnej triedy (či už predvolený alebo parametrizovaný) a potom následuje konštruktor odvodenej triedy.
Nasledujúci program demonštruje poradie konštruktorov v dedičstve. Máme triedu Base „Base“, ktorá má predvolený konštruktor a parametrizovaný konštruktor. Z toho odvodíme triedu s názvom „Odvodené“, ktorá má tiež jeden predvolený a ďalší parametrizovaný konštruktor.
najlepší web na pozeranie anime online
Výstup tohto programu ukazuje poradie, v akom sa volajú konštruktory.
#include using namespace std; //order of execution of constructors in inheritance class Base { int x; public: // default constructor Base() { cout Výkon:
Predvolený konštruktor základnej triedy
Predvolený konštruktor základnej triedy
Odvodený predvolený konštruktor triedy
Konštruktor parametrizovaný základnou triedou
Odvodený parametrizovaný konštruktor triedy
Vidíme, že po vytvorení objektu základnej triedy vytvoríme objekt odvodenej triedy s predvoleným konštruktorom. Keď je tento objekt vytvorený, najskôr sa zavolá predvolený konštruktor základnej triedy a potom sa vykoná konštruktor odvodenej triedy.
Podobne, keď sa objekt odvodenej triedy vytvára pomocou parametrizovaného konštruktora, najskôr sa volá parametrizovaný konštruktor základnej triedy a potom sa volá konštruktor odvodenej triedy.
Všimnite si, že keby v základnej triede nebol žiadny parametrizovaný konštruktor, potom by sa predvolený konštruktor volal aj na konštrukciu parametrizovaného objektu odvodenej triedy.
Otázkou ale zostáva, prečo sa pri konštruovaní odvodených objektov triedy volá konštruktor základnej triedy?
Vieme, že konštruktor sa používa na vytváranie objektov triedy a tiež na inicializáciu členov triedy. Keď je vytvorený objekt odvodenej triedy, jeho konštruktor má kontrolu iba nad členmi odvodenej triedy.
Odvodená trieda však dedí aj členov základnej triedy. Keby sa volal iba konštruktor odvodenej triedy, potom by sa členovia základnej triedy zdedení po odvodenej triede neinicializovali správne.
Vo výsledku nebude celý objekt vytvorený efektívne. To je dôvod, prečo sa všetky konštruktory základnej triedy volajú ako prvé, keď sa vytvorí objekt odvodenej triedy.
Druhy dedenia
V závislosti od spôsobu, akým je trieda odvodená, alebo od počtu základných tried, ktoré trieda dedí, máme nasledujúce typy dedenia, ako je znázornené na obrázku nižšie.

Každý z týchto typov preskúmame v našom ďalšom návode na tému „Typy dedičnosti“.
Dedenie šablón
Keď naša implementácia zahŕňa šablóny, potom musíme dediť alebo odvodiť z tried šablón a tam využijeme dedenie šablón.
Prejdime priamo k príkladu programovania, aby sme lepšie pochopili dedičnosť pomocou šablón.
#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< Výkon:
basecls_Template obj = 100
odvodenécls_Child obj1 (zdedené z basecls_Template = A
Vo vyššie uvedenom programe máme šablónu s názvom basecls_Template, ktorá definuje šablónu triedy pre základnú triedu. Ďalej definujeme triedu odvodenécls_Child, ktorú chceme odvodiť z triedy šablón.
Ale všimnite si, že trieda basecls_Template je iba typ a nie trieda. Teda z tejto šablóny nemôžeme odvodiť triedu odvodenúcls_Child.
Preto ak deklarujeme podradenú triedu ako:
class derivedcls_Child : public basecls_Template
To bude mať za následok chybu. Dôvodom basecls_Template je dátový typ a nie trieda. Aby sme teda mohli dediť členov basecls_Template, mali by sme ich najskôr vytvoriť inštanciu, než z nich odvodíme.
Preto vyššie uvedené vyhlásenie, Trieda odvodenácls_Child: verejná basecls_Template funguje dobre.
V tomto vyhlásení sme vytvorili inštanciu šablóny basecls_Template so šablónou triedy znakov. Akonáhle použijeme túto inštančnú triedu šablón, ďalšie nasledujúce veci, ako napríklad vytváranie a používanie objektov, sa zhodujú s obvyklou funkciou dedenia.
Zloženie
Doteraz sme videli všetko o dedičských vzťahoch. Dedenie v zásade zobrazuje druh vzťahov, v ktorých vzťah označuje časť. Napríklad, had je akýsi plaz. Môžeme tiež povedať, že Reptile je súčasťou triedy Animal.
Záverom možno povedať, že dedičstvo naznačuje „IS-A“ druh vzťahov, pri ktorých môžeme povedať, že odvodená trieda je súčasťou základnej triedy.
Môžeme tiež reprezentovať vzťahy ako celok. Napríklad, ak hovoríme, že platová trieda je súčasťou triedy zamestnancov, potom ju nereprezentujeme správne. Vieme, že zamestnanci majú plat. Preto je pohodlnejšie povedať „Zamestnanec má plat“.
Podobne, ak si vezmeme ako príklad triedu Vozidlá, môžeme povedať, že Vozidlo má motor alebo Vozidlo má podvozok. Všetky tieto vzťahy teda vyobrazujú 'MÁ' vzťahy, ktoré predstavujú celý objekt obsiahnutý v inej triede. Toto je definované ako Zloženie .
Vzťahy zobrazené podľa zloženia závisia jeden na druhom. Napríklad, podvozok nemôže existovať bez vozidla. Plat rovnako nemôže existovať bez zamestnanca.
Skladbu môžeme znázorniť schematicky, ako je uvedené nižšie:

Zloženie sa tiež nazýva Zadržanie. Vo vyššie uvedenom znázornení sme ukázali rodičovskú triedu. Na rozdiel od dedenia začleňujeme do triedy rodiča objekt podradenej triedy. Toto je zadržiavanie alebo zloženie.
najlepší anti spyware pre Windows 10
Zoberme si príklad programovania, aby sme tomu porozumeli.
#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< Výkon:
10001 Ved
A-101 Silver Springs Aundh Pune Maharashtra
V tomto príklade máme nadradenú triedu Employee a podradenú triedu Address. Vo vnútri nadradenej triedy Employee sme deklarovali smerník na triedu Address a tiež tento objekt inicializujeme v konštruktore Employee. Takto zobrazujeme vzťah, ktorý má zamestnanec k adrese, ktorá je zložením.
Ako by sme sa mali rozhodnúť medzi zložením a dedičstvom?
Zloženie aj dedičstvo zobrazujú vzťahy medzi triedami. Zatiaľ čo dedičstvo zobrazuje vzťah „IS-A“, zloženie zobrazuje vzťah „HAS-A“.
Otázkou teraz je, kedy by sme mali použiť dedičstvo a kedy kompozíciu? V skutočnosti nemôžeme rozhodnúť o presných situáciách, kedy by sme mali použiť jednu z nich. Je to tak preto, lebo každý má svoje výhody a nevýhody.
Oba podporujú opätovné použitie kódu. Dedenie môže spôsobiť, že kód bude objemný, pretože riešenia sa stanú zložitými, ale zároveň nám umožní rozšíriť existujúci kód. Dedičstvo by sme teda mali používať, keď je našou požiadavkou modifikovať a používať vlastnosti a metódu inej triedy v novej triede.
Inými slovami, keď chceme pridať ďalšie vlastnosti a rozšíriť existujúcu triedu. Na druhej strane, keď nechceme upravovať vlastnosti a správanie inej triedy, ale jednoducho ju použiť vo vnútri triedy, ideme na zloženie.
Najlepšie teda bude, či sa použije zloženie alebo dedičstvo zvážením výhod a nevýhod oboch techník pre konkrétnu situáciu.
= >> Prečítajte si tiež Zloženie v Jave
Záver
Dostali sme sa tak na koniec našej témy o dedičstve. Videli sme rôzne spôsoby dedenia. Tiež sme videli typy dedičstva, ktoré preskúmame v našom ďalšom návode. Dozvedeli sme sa o poradí konštruktorov, ktoré sa vykonávajú v prípade dedičstva.
Študovali sme tiež šablóny a dedičstvo. Šablónu musíme vytvoriť inštanciu skôr, ako ju budeme môcť použiť v dedičstve, pretože samotná šablóna je dátový typ a nemôžeme dediť z dátového typu.
Skladba je ďalším typom triedneho vzťahu a najskôr musíme poznať presnú situáciu a až potom sa môžeme rozhodnúť, či použijeme zloženie alebo dedičstvo.
V našom pripravovanom návode uvidíme viac o druhoch dedičstva.
=> Dajte si pozor na jednoduchú sériu školení C ++ tu.
Odporúčané čítanie
- Typy dedenia v C ++
- Runtime polymorfizmus v C ++
- Funkcie priateľov v C ++
- Používanie triedy výberu selénu na prácu s prvkami rozbaľovacej ponuky na webovej stránke - Výučba selénu č. 13
- Triedy a objekty v C ++
- Statické v C ++
- Výukový program pre Unix Pipes: Rúry v programovaní v Unixe
- Príručka k rozhraniu Java a abstraktnej triede