inheritance c
Važnost nasljeđivanja u C ++ s primjerima:
Nasljeđivanje je jedno od najvažnijih obilježja objektno orijentiranog programiranja.
Nasljeđivanje je tehnika kojom jedna klasa stječe svojstva i metode druge klase. Na ovaj način možemo ponovno koristiti kôd koji je već napisan i provjeren. Klasa koja stječe svojstva druge klase naziva se podklasa ili izvedena klasa ili podređena klasa.
Klasa čija su svojstva stečena naziva se osnovna klasa ili roditeljska klasa ili superklasa. Kada jedna klasa stekne ili naslijedi drugu klasu, tada su sva svojstva i metode osnovne klase dostupne izvedenoj klasi, tako da možemo ponovno koristiti ovaj kôd.
=> Posjetite ovdje da biste C ++ naučili od nule.
besplatni DVD ripper za Windows 8.1
Što ćete naučiti:
- Zašto nam je potrebno nasljeđivanje?
- Načini nasljeđivanja
- Poredak konstruktora / destruktora u nasljeđivanju
- Vrste nasljeđivanja
- Nasljeđivanje predloška
- Sastav
- Kako bismo trebali odlučiti između sastava i nasljeđa?
- Zaključak
- Preporučena literatura
Zašto nam je potrebno nasljeđivanje?
Razmotrimo skupinu vozila poput automobila, autobusa, džipa itd. Svako od ovih vozila imat će svojstva i metode kako je navedeno u donjem dijagramu.
Ako se od nas zahtijeva da implementiramo pojedinačne razrede za gore navedena vozila, možemo vidjeti da ćemo u sve tri klase morati napisati isti kôd kao što sve tri vrste vozila više ili manje pokazuju ista svojstva. To će naš program učiniti neučinkovitim i glomaznim jer će biti puno dupliciranih kodova.
Umjesto pisanja dupliciranog koda kao gore, možemo implementirati značajku nasljeđivanja kako bismo spriječili dupliciranje koda, a također napisali jedan dio koda i koristili ga u sve tri klase. Ovo je slikovito prikazano kao u nastavku.
Na gornjoj slici definirali smo osnovnu klasu 'Vozila' i iz te klase izveli klase Car, Bus i Jeep. Uobičajene metode i svojstva dio su klase Vozila sada. Kako su druge klase izvedene iz klase Vozila, sve klase stječu ove metode i svojstva.
Stoga, zajednički kod trebamo napisati samo jednom i sve tri klase; Kupit će ga automobil, autobus i džip.
Stoga je glavna prednost koju dobivamo nasljeđivanjem postojećih klasa ili dizajniranjem mehanizma nasljeđivanja ponovna upotreba koda.
Daljnje čitanje = >> Vodič za nasljeđivanje Java
Općeniti format nasljeđivanja klase je:
class derived_classname: access_specifier base_classname { };
Ovdje “ izvedeno_ime klase 'Je ime izvedene klase,' specifikacija_dodaja 'Je način pristupa, tj. Javni, zaštićeni ili privatni u kojem izvedena klasa mora naslijediti osnovnu klasu i' izvedeno_ime klase ”Je ime osnovne klase iz koje nasljeđena izvedena klasa.
Načini nasljeđivanja
'Access_specifier' prikazan u gornjoj izjavi o nasljeđivanju može imati svoje vrijednosti kao što je prikazano u nastavku.
Ovisno o specificiranom access_specifieru kada nasljeđujemo klasu, imamo različite načine nasljeđivanja kako su navedeni u nastavku.
Javno nasljeđivanje
Opća sintaksa
class sub_class : public parent_class
Kad je specificiran specifikator javnog pristupa, javni članovi osnovne klase nasljeđuju se kao javni dok su zaštićeni članovi zaštićeni. Privatni članovi ostaju privatni. Ovo je najpopularniji način nasljeđivanja.
Privatno nasljeđivanje
Opća sintaksa
class sub_class : parent_class
Privatno nasljedstvo ne nasljeđuje ništa. Kada se koristi specifikator privatnog pristupa, javni i zaštićeni članovi osnovne klase također postaju privatni.
Zaštićeno nasljeđe
Opća sintaksa
class sub_class:protected parent_class
Kada se koristi specifikator zaštićenog pristupa, javni i zaštićeni članovi osnovne klase postaju zaštićeni članovi izvedene klase.
Imajte na umu da kada koristimo specifikator privatnog pristupa za osnovnu klasu, niti jedan od članova osnovne klase se ne nasljeđuje. Svi oni postaju privatni u izvedenoj klasi.
Slijedi tabelarni prikaz svih načina pristupa i njihova interpretacija za nasljeđivanje.
Izvedena klasa -> Osnovna klasa | Privatna | Javnost | Zaštićen |
---|---|---|---|
Privatna | Nije naslijeđeno | Nije naslijeđeno | Nije naslijeđeno |
Javnost | Privatna | Javnost | Zaštićen |
Zaštićen | Privatna | Zaštićen | Zaštićen |
Poredak konstruktora / destruktora u nasljeđivanju
Kada se klase nasljeđuju, konstruktori se pozivaju istim redoslijedom kao i klase. Ako imamo osnovnu klasu i jednu izvedenu klasu koja nasljeđuje ovu osnovnu klasu, tada će se prvo pozvati konstruktor osnovne klase (bez obzira je li zadana ili parametrizirana), a zatim izvedeni konstruktor klase.
Sljedeći program pokazuje redoslijed konstruktora u nasljeđivanju. Imamo osnovnu klasu “Base” koja ima zadani konstruktor i parametrizirani konstruktor. Iz ovoga izvodimo klasu koja se naziva 'Izvedeno' koja također ima jedan zadani i drugi parametarski konstruktor.
Izlaz ovog programa prikazuje redoslijed pozivanja konstruktora.
#include using namespace std; //order of execution of constructors in inheritance class Base { int x; public: // default constructor Base() { cout Izlaz:
Zadani konstruktor osnovne klase
Zadani konstruktor osnovne klase
Izvedeni zadani konstruktor klase
Parametarski konstruktor osnovne klase
Izvedeni parametarski konstruktor izvedene klase
Vidimo da nakon stvaranja objekta osnovne klase stvaramo izvedeni objekt klase sa zadanim konstruktorom. Kada se ovaj objekt kreira, prvo se poziva zadani konstruktor osnovne klase, a zatim se izvršava izvedeni konstruktor klase.
Slično tome, kada se izvedeni objekt klase kreira pomoću parametarskog konstruktora, prvo se poziva parametarski konstruktor osnovne klase, a zatim se zove izvedeni konstruktor klase.
Imajte na umu da ako u osnovnoj klasi nije bilo parametarskog konstruktora, tada bi zadani konstruktor bio pozvan čak i za izgradnju parametarski izvedenog objekta klase.
Ali ostaje pitanje zašto se prilikom konstrukcije izvedenih objekata klase poziva konstruktor osnovne klase?
Znamo da se konstruktor koristi za stvaranje objekata klase i također za inicijalizaciju članova klase. Kada se kreira izvedeni objekt klase, njegov konstruktor ima kontrolu samo nad izvedenim članovima klase.
Međutim, izvedena klasa također nasljeđuje članove osnovne klase. Kad bi se pozvao samo izvedeni konstruktor klase, tada članovi osnovne klase naslijeđene od izvedene klase ne bi bili pravilno inicijalizirani.
Kao rezultat, cijeli objekt neće biti stvoren učinkovito. To je razlog zbog kojeg se svi konstruktori osnovne klase pozivaju prvi kada se kreira izvedeni objekt klase.
Vrste nasljeđivanja
Ovisno o načinu na koji je izvedena klasa ili koliko baznih klasa nasljeđuje klasa, imamo sljedeće vrste nasljeđivanja kao što je prikazano na donjoj slici.
Istražit ćemo svaku od ovih vrsta u našem sljedećem vodiču o „Vrste nasljeđivanja“.
Nasljeđivanje predloška
Kada naša implementacija uključuje predloške, tada moramo naslijediti ili izvesti iz klasa predložaka i tamo koristimo nasljeđivanje predloška.
Krenimo izravno na Primjer programiranja kako bismo bolje razumjeli nasljeđivanje pomoću predložaka.
#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< Izlaz:
basecls_Template obj = 100
najbolji os otvorenog koda za laptop
izvedenocls_Child obj1 (naslijeđeno od basecls_Template = A
U gornjem programu imamo predložak nazvan basecls_Template koji definira predložak klase za osnovnu klasu. Dalje, definiramo klasu izvedenucls_Child koju želimo izvesti iz klase predloška.
Ali imajte na umu da je klasa basecls_Template samo vrsta, a ne klasa. Stoga iz ovog predloška ne možemo izvesti klasu izvedenucls_Child.
Stoga ako proglasimo podređeni razred kao:
class derivedcls_Child : public basecls_Template
To će rezultirati pogreškom. Razlog što je basecls_Template je vrsta podataka, a ne klasa. Dakle, da bismo naslijedili članove basecls_Template, trebali bismo ga prvo instancirati prije nego što iz njega izvedemo.
Stoga gornja izjava, Izvedena klasacls_Child: public basecls_Template dobro funkcionira.
U ovoj smo izjavi instancirali predložak basecls_Template u predložak klase znakova. Jednom kada koristimo ovu instanciranu klasu predloška, tada se ostale stvari koje slijede, poput stvaranja i korištenja objekata, podudaraju s uobičajenim funkcioniranjem nasljeđivanja.
Sastav
Do sada smo vidjeli sve o nasljednim odnosima. Nasljeđivanje u osnovi prikazuje vrstu odnosa u kojima odnos ukazuje na dio. Na primjer, zmija je vrsta gmaza. Također možemo reći da je gmizavac dio klase životinja.
Zaključno, nasljeđivanje ukazuje 'JE' vrsta odnosa u kojima možemo reći da je izvedena klasa dio osnovne klase.
Također možemo predstavljati odnose u cjelini. Na primjer, ako kažemo da je klasa plaće dio klase zaposlenika, onda je ne predstavljamo pravilno. Znamo da zaposlenici imaju plaću. Stoga je prikladnije reći 'Zaposlenik ima plaću'.
Slično tome, ako za primjer uzmemo klasu Vozila, možemo reći da Vozilo ima motor ili Vozilo ima šasiju. Tako prikazuju svi ti odnosi 'IMA' odnosi koji predstavljaju cijeli objekt sadržan u drugoj klasi. To se definira kao Sastav .
Odnosi prikazani kompozicijom ovise jedni o drugima. Na primjer, šasija ne može postojati bez Vozila. Slično tome, plaća ne može postojati bez zaposlenika.
Sastav možemo shematski predstaviti kako je prikazano dolje:
Sastav se također naziva i Zadržavanje. U gornjem smo prikazu pokazali roditeljski razred. Za razliku od nasljeđivanja, unutar roditeljske klase uključujemo objekt podređene klase. Ovo je sadržaj ili sastav.
jedinični test vs integracijski test vs funkcionalni test
Uzmimo primjer programiranja da bismo to razumjeli.
#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< Izlaz:
10001 Ved
A-101 Srebrni izvori Aundh Pune Maharashtra
U ovom primjeru imamo roditeljsku klasu Employee i podređenu adresu klase. Unutar nadređene klase Employee proglasili smo pokazivač na klasu Address i također inicijalizirali ovaj objekt u konstruktoru Employee. Tako prikazujemo odnos zaposlenika s adresom koja je njegov sastav.
Kako bismo trebali odlučiti između sastava i nasljeđa?
Sastav i nasljeđivanje prikazuju odnose između klasa. Dok nasljeđe prikazuje odnos 'IS-A', kompozicija prikazuje odnos 'HAS-A'.
Sad se postavlja pitanje kada bismo trebali koristiti nasljedstvo, a kada kompoziciju? Zapravo, ne možemo odlučiti o točnim situacijama kao kad bismo trebali koristiti bilo koju od njih. To je zato što svaka ima svoje prednosti i nedostatke.
Obje promoviraju ponovnu upotrebu koda. Nasljeđivanje može kod učiniti glomaznim, jer rješenja postaju složena, ali istovremeno nam omogućuje i proširivanje postojećeg koda. Stoga bismo trebali koristiti nasljeđivanje kada je naš zahtjev modificirati i koristiti svojstva i metodu druge klase unutar nove klase.
Drugim riječima, kada želimo dodati više svojstava i proširiti postojeću klasu. S druge strane, kada ne želimo modificirati svojstva i ponašanje druge klase, već je jednostavno koristimo unutar klase, idemo na sastav.
Stoga je najbolja odluka hoće li se koristiti kompozicija ili nasljeđivanje donijeti odmjeravanjem prednosti i nedostataka obje tehnike za određenu situaciju.
= >> Pročitajte i Sastav na Javi
Zaključak
Tako smo došli do kraja naše teme o nasljeđivanju. Vidjeli smo razne načine nasljeđivanja. Vidjeli smo i vrste nasljeđivanja koje ćemo istražiti u sljedećem vodiču. Saznali smo za redoslijed konstruktora koji se izvršavaju u slučaju nasljeđivanja.
Također smo proučavali predloške i nasljeđivanje. Moramo instancirati predložak prije nego što ga možemo koristiti u nasljeđivanju jer je sam predložak vrsta podataka i ne možemo naslijediti iz tipa podataka.
Sastav je druga vrsta klasnih odnosa i prvo moramo znati točnu situaciju, a tek onda možemo odlučiti hoćemo li koristiti kompoziciju ili nasljeđivanje.
U našem nadolazećem uputstvu vidjet ćemo više o vrstama nasljeđivanja.
=> Ovdje pripazite na jednostavne serije obuke za C ++.
Preporučena literatura
- Vrste nasljeđivanja u C ++
- Runtime polimorfizam u C ++
- Funkcije prijatelja u C ++
- Korištenje selenijske klase za rukovanje padajućim elementima na web stranici - Vodič za selenij br. 13
- Razredi i objekti u C ++
- Statički u C ++
- Vodič za Unix cijevi: Cijevi u Unix programiranju
- Java sučelje i udžbenik sažetka klase s primjerima