inheritance c
Důležitost dědičnosti v C ++ s příklady:
Dědičnost je jednou z nejdůležitějších vlastností objektově orientovaného programování.
Dědičnost je technika, kterou jedna třída získává vlastnosti a metody jiné třídy. Tímto způsobem můžeme znovu použít kód, který je již napsán a ověřen. Třída, která získává vlastnosti jiné třídy, se nazývá podtřída nebo odvozená třída nebo podřízená třída.
Třída, jejíž vlastnosti jsou získány, se nazývá základní třída nebo nadřazená třída nebo nadtřída. Když jedna třída získá nebo zdědí jinou třídu, pak jsou pro odvozenou třídu k dispozici všechny vlastnosti a metody základní třídy, abychom mohli tento kód znovu použít.
=> Navštivte zde a dozvíte se C ++ od nuly.
jak používat double v Javě
Co se naučíte:
- Proč potřebujeme dědictví?
- Režimy dědičnosti
- Pořadí konstruktérů / ničitelů v dědičnosti
- Druhy dědičnosti
- Dědičnost šablon
- Složení
- Jak bychom se měli rozhodnout mezi složením a dědičností?
- Závěr
- Doporučené čtení
Proč potřebujeme dědictví?
Zvažte skupinu vozidel, jako je auto, autobus, džíp atd. Každé z těchto vozidel bude mít vlastnosti a metody, jak je uvedeno v následujícím diagramu.
Pokud jsme povinni implementovat jednotlivé třídy pro výše uvedená vozidla, vidíme, že ve všech třech třídách budeme muset napsat stejný kód, protože všechny tři typy vozidel vykazují víceméně stejné vlastnosti. Díky tomu bude náš program neefektivní a těžkopádný, protože bude existovat spousta duplicitních kódů.
Místo psaní duplicitního kódu, jak je uvedeno výše, můžeme implementovat funkci dědičnosti, abychom zabránili duplikaci kódu, a také napsat jeden kus kódu a použít ho ve všech třech třídách. Toto je ilustrováno níže.
Na výše uvedeném obrázku jsme definovali základní třídu „Vozidla“ a z této třídy jsme odvodili třídy Car, Bus a Jeep. Společné metody a vlastnosti jsou nyní součástí třídy Vozidla. Protože ostatní třídy jsou odvozeny od třídy Vozidla, všechny třídy získávají tyto metody a vlastnosti.
Proto stačí napsat společný kód pouze jednou a všechny tři třídy; Auto, autobus a Jeep jej získají.
Hlavní výhodou, kterou získáme zděděním existujících tříd nebo návrhem mechanismu dědičnosti, je tedy opětovná použitelnost kódu.
Další čtení = >> Výukový program Java Inheritance
Obecný formát pro zdědění třídy je:
class derived_classname: access_specifier base_classname { };
Tady ' odvozená_třída „Je název odvozené třídy,“ access_specifier „Je režim přístupu, tj. Veřejný, chráněný nebo soukromý, ve kterém musí odvozená třída zdědit základní třídu a“ odvozená_třída „Je název základní třídy, ze které odvozená třída dědí.
Režimy dědičnosti
„Přístupový_specifikátor“ zobrazený ve výše uvedené deklaraci dědičnosti může mít své hodnoty, jak je uvedeno níže.
V závislosti na specifikovaném access_specifier při dědění třídy máme různé režimy dědičnosti, jak je uvedeno níže.
Veřejné dědictví
Obecná syntaxe
class sub_class : public parent_class
Když je zadán specifikátor veřejného přístupu, veřejní členové základní třídy se dědí jako veřejní, zatímco chránění členové jsou chráněni. Soukromí členové zůstávají soukromí. Toto je nejoblíbenější způsob dědičnosti.
Soukromé dědictví
Obecná syntaxe
class sub_class : parent_class
Soukromé dědictví nezdědí nic. Když se použije specifikátor soukromého přístupu, veřejné a chráněné členy základní třídy se také stanou soukromými.
Chráněné dědictví
Obecná syntaxe
class sub_class:protected parent_class
Při použití specifikátoru chráněného přístupu se veřejní a chránění členové základní třídy stanou chráněnými členy v odvozené třídě.
Všimněte si, že když použijeme specifikátor soukromého přístupu pro základní třídu, žádný z členů základní třídy se nezdědí. Všichni se v odvozené třídě stávají soukromými.
Níže je uvedena tabularizovaná reprezentace všech režimů přístupu a jejich interpretace pro dědičnost.
Odvozená třída -> Základní třída | Soukromé | Veřejnost | Chráněný |
---|---|---|---|
Soukromé | Nezděděno | Nezděděno | Nezděděno |
Veřejnost | Soukromé | Veřejnost | Chráněný |
Chráněný | Soukromé | Chráněný | Chráněný |
Pořadí konstruktérů / ničitelů v dědičnosti
Když jsou třídy zděděny, konstruktory jsou volány ve stejném pořadí, v jakém jsou třídy zděděny. Pokud máme základní třídu a jednu odvozenou třídu, která zdědí tuto základní třídu, bude nejprve volán konstruktor základní třídy (ať už výchozí nebo parametrizovaný), následovaný konstruktorem odvozené třídy.
Následující program ukazuje pořadí konstruktorů v dědičnosti. Máme třídu Base „Base“, která má výchozí konstruktor a parametrizovaný konstruktor. Z toho odvozujeme třídu s názvem „Odvozeno“, která má také jeden výchozí a další parametrizovaný konstruktor.
Výstup tohoto programu ukazuje pořadí, ve kterém jsou konstruktory volány.
#include using namespace std; //order of execution of constructors in inheritance class Base { int x; public: // default constructor Base() { cout Výstup:
Výchozí konstruktor základní třídy
Výchozí konstruktor základní třídy
Odvozený výchozí konstruktor třídy
Konstruktor s parametrizací základní třídy
Odvozený konstruktor parametrizovaný třídou
Vidíme, že po vytvoření objektu základní třídy vytvoříme objekt odvozené třídy s výchozím konstruktorem. Když je tento objekt vytvořen, je nejprve volán výchozí konstruktor základní třídy a poté je spuštěn konstruktor odvozené třídy.
Podobně, když je objekt odvozené třídy vytvořen pomocí parametrizovaného konstruktoru, je nejprve volán konstruktor parametrizované základní třídy a poté je volán konstruktor odvozené třídy.
Všimněte si, že pokud v základní třídě nebyl žádný parametrizovaný konstruktor, pak by byl výchozí konstruktor volán i pro konstrukci parametrizovaného odvozeného objektu třídy.
Otázkou ale zůstává, proč se volá konstruktor základní třídy při konstrukci odvozených objektů třídy?
Víme, že konstruktor se používá k vytváření objektů třídy a také k inicializaci členů třídy. Když je vytvořen objekt odvozené třídy, jeho konstruktor má kontrolu pouze nad členy odvozené třídy.
Odvozená třída však dědí také členy základní třídy. Pokud byl volán pouze konstruktor odvozené třídy, členové základní třídy zděděné odvozenou třídou by nebyli správně inicializováni.
Ve výsledku nebude celý objekt vytvořen efektivně. To je důvod, proč jsou všechny konstruktory základní třídy volány jako první, když je vytvořen objekt odvozené třídy.
role obchodního analytika v agilním skrumáži
Druhy dědičnosti
V závislosti na způsobu, jakým je třída odvozena nebo kolik základních tříd třída dědí, máme následující typy dědičnosti, jak je znázorněno na obrázku níže.
Každý z těchto typů prozkoumáme v našem dalším výukovém programu „Typy dědičnosti“.
Dědičnost šablon
Když naše implementace zahrnuje šablony, pak musíme zdědit nebo odvodit z tříd šablon a tam využijeme dědičnost šablon.
Pojďme přímo přeskočit na programovací příklad, abychom lépe porozuměli dědičnosti pomocí šablon.
#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ýstup:
basecls_Template obj = 100
derivedcls_Child obj1 (zděděno z basecls_Template = A
Ve výše uvedeném programu máme šablonu s názvem basecls_Template, která definuje šablonu třídy pro základní třídu. Dále definujeme třídu odvozenoucls_Child, kterou chceme odvodit ze třídy šablony.
Ale všimněte si, že třída basecls_Template je pouze typ a ne třída. Z této šablony tedy nemůžeme odvodit třídu odvozenoucls_Child.
Proto pokud deklarujeme podřízenou třídu jako:
class derivedcls_Child : public basecls_Template
To bude mít za následek chybu. Důvodem, proč je basecls_Template, je datový typ a ne třída. Abychom tedy zdědili členy basecls_Template, měli bychom to nejprve vytvořit instanci, než z ní odvozíme.
Proto výše uvedené prohlášení, Třída odvozenácls_Child: veřejná basecls_Template funguje dobře.
V tomto prohlášení jsme vytvořili instanci šablony basecls_Template na šablonu třídy znaků. Jakmile použijeme tuto instanční třídu šablony, další věci, které následují, jako je vytváření a používání objektů, se shodují s obvyklým fungováním dědičnosti.
Složení
Zatím jsme viděli vše o dědických vztazích. Dědičnost v zásadě zobrazuje druh vztahů, kde vztah označuje část. Například, had je druh plazů. Můžeme také říci, že Reptile je součástí třídy Animal.
Závěrem lze říci, že dědictví naznačuje 'JE' druh vztahů, kde můžeme říci, že odvozená třída je součástí základní třídy.
Můžeme také reprezentovat vztahy jako celek. Například, pokud řekneme, že třída Plat je součástí třídy Zaměstnanec, pak ji nepředstavujeme správně. Víme, že zaměstnanci mají plat. Je tedy pohodlnější říci „Zaměstnanec má plat“.
Podobně, vezmeme-li jako příklad třídu Vozidla, můžeme říci, že Vozidlo má motor nebo Vozidlo má podvozek. Všechny tyto vztahy tedy zobrazují 'MÁ' vztahy, které představují celý objekt obsažený v jiné třídě. To je definováno jako Složení .
Vztahy zobrazené podle složení jsou vzájemně závislé. Například, podvozek nemůže existovat bez vozidla. Podobně plat nemůže existovat bez zaměstnance.
Můžeme reprezentovat složení schematicky, jak je znázorněno níže:
Složení se také nazývá Zadržení. Ve výše uvedeném znázornění jsme ukázali rodičovskou třídu. Na rozdíl od dědičnosti zahrneme do nadřazené třídy objekt podřízené třídy. Jedná se o zadržení nebo složení.
jak mohu otevřít torrentovaný soubor
Vezměme si příklad programování, abychom tomu porozuměli.
#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ýstup:
10001 Ved
A-101 Silver Springs Aundh Pune Maharashtra
V tomto příkladu máme nadřazenou třídu Zaměstnanec a podřízenou třídu Adresa. Uvnitř nadřazené třídy Employee jsme deklarovali ukazatel na třídu Address a také inicializovali tento objekt v konstruktoru Employee. Zobrazujeme tedy vztah, ke kterému má zaměstnanec adresu, což je složení.
Jak bychom se měli rozhodnout mezi složením a dědičností?
Složení a dědičnost zobrazují vztahy mezi třídami. Zatímco dědictví zobrazuje vztah „IS-A“, složení zobrazuje vztah „HAS-A“.
Otázkou nyní je, kdy bychom měli použít dědičnost a kdy bychom měli použít složení? Ve skutečnosti nemůžeme rozhodnout o přesných situacích, kdy bychom měli použít kteroukoli z nich. Je to proto, že každý má své vlastní výhody a nevýhody.
Oba podporují opětovné použití kódu. Dědičnost může způsobit, že kód bude objemný, jak se řešení stávají složitými, ale zároveň nám také umožňuje rozšířit stávající kód. Měli bychom tedy použít dědičnost, když naším požadavkem je upravit a použít vlastnosti a metodu jiné třídy uvnitř nové třídy.
Jinými slovy, když chceme přidat další vlastnosti a rozšířit stávající třídu. Na druhou stranu, když nechceme upravit vlastnosti a chování jiné třídy, ale jednoduše ji použít uvnitř třídy, přejdeme ke složení.
Nejlepším rozhodnutím tedy bude, zda použít složení nebo dědičnost bude provedeno zvážením výhod a nevýhod obou technik pro konkrétní situaci.
= >> Přečtěte si také Složení v Javě
Závěr
Tak jsme se dostali ke konci našeho tématu o dědičnosti. Viděli jsme různé způsoby dědičnosti. Také jsme viděli typy dědičnosti, které prozkoumáme v našem dalším kurzu. Dozvěděli jsme se o pořadí konstruktorů, které se provádějí v případě dědičnosti.
Studovali jsme také šablony a dědičnost. Potřebujeme vytvořit instanci šablony, než ji budeme moci použít v dědičnosti, protože samotná šablona je datový typ a nemůžeme dědit z datového typu.
Skladba je dalším typem třídního vztahu a nejdříve potřebujeme znát přesnou situaci a pak pouze my můžeme rozhodnout, zda použijeme složení nebo dědičnost.
V našem nadcházejícím tutoriálu uvidíme více o typech dědičnosti.
=> Dávejte pozor na jednoduchou sérii školení C ++ zde.
Doporučené čtení
- Typy dědičnosti v C ++
- Runtime polymorfismus v C ++
- Funkce přátel v C ++
- Použití třídy Select Selenium pro zpracování prvků rozevíracího seznamu na webové stránce - Selenium Tutorial # 13
- Třídy a objekty v C ++
- Statické v C ++
- Výukový program pro Unix Pipes: Pipes v programování Unixu
- Výukový program pro rozhraní Java a abstraktní třídu s příklady