Nasljeđivanje u C++
Nasljeđe je temeljni koncept u OOP (objektno orijentirano programiranje) . To je mehanizam kojim je jednoj klasi dopušteno naslijediti značajke (polja i metode) druge klase. Nasljeđivanje znači stvaranje novih klasa na temelju postojećih. Klasa koja nasljeđuje drugu klasu može ponovno koristiti metode i polja te klase.
Primjer: U sljedećem primjeru Animal je osnovna klasa, a Dog Cat i Cow su izvedene klase koje proširuju klasu Animal.
Inheritance C++ #include using namespace std ; class Animal { public : void sound () { cout < < 'Animal makes a sound' < < endl ; } }; class Dog : public Animal { public : void sound () { cout < < 'Dog barks' < < endl ; } }; class Cat : public Animal { public : void sound () { cout < < 'Cat meows' < < endl ; } }; class Cow : public Animal { public : void sound () { cout < < 'Cow moos' < < endl ; } }; int main () { Dog d ; d . sound (); Cat c ; c . sound (); Cow cow ; cow . sound (); return 0 ; }
Izlaz
Dog barks Cat meows Cow moos
Obrazloženje:
- Animal je osnovna klasa s funkcijom sound().
- Pas Mačka i Krava su izvedene klase od kojih svaka definira vlastitu metodu sound().
- U main() objekti Dog Cat i Cow kreiraju se odvojeno.
- Kada pozovemo sound() na svakom objektu, izvodi se odgovarajuća metoda podređene klase (pas laje, mačka mjauče, krava muče).
Sintaksa
C++ class ChildClass : public ParentClass { // Additional fields and methods };
Kako funkcionira nasljeđivanje u C++?
Dvotočka (:) s an specifikator pristupa koristi se za nasljeđivanje u C++. Omogućuje izvedenoj klasi (klasi dijete) da naslijedi članove podataka (polja) i funkcije članice (metode) osnovne klase (klase roditelja).
Kada klasa naslijedi drugu klasu, ona dobiva sve dostupne članove roditeljske klase, a podređena klasa ih također može redefinirati (nadjačati) ili im dodati novu funkcionalnost.
Vrste nasljeđivanja u C++
Ispod su različite vrste nasljeđivanja koje podržava C++.
1. Jedno nasljeđivanje
Kod jednostrukog nasljeđivanja potklasa je izvedena iz samo jedne super klase. Nasljeđuje svojstva i ponašanje jednoroditeljske klase. Ponekad je poznato i kao jednostavno nasljeđivanje.
Single Inheritance C++ #include using namespace std ; class Vehicle { public : Vehicle () { cout < < 'This is a Vehicle' < < endl ; } }; class Car : public Vehicle { public : Car () { cout < < 'This Vehicle is Car' < < endl ; } }; int main () { Car obj ; return 0 ; }
Izlaz
This is a Vehicle This Vehicle is Car
2. Višestruko nasljeđivanje
U Višestruko nasljeđivanje jedna klasa može imati više od jedne superklase i naslijediti značajke od svih roditeljskih klasa.
Multiple Inheritance C++ #include using namespace std ; class LandVehicle { public : void landInfo () { cout < < 'This is a LandVehicle' < < endl ; } }; class WaterVehicle { public : void waterInfo () { cout < < 'This is a WaterVehicle' < < endl ; } }; // Derived class inheriting from both base classes class AmphibiousVehicle : public LandVehicle public WaterVehicle { public : AmphibiousVehicle () { cout < < 'This is an AmphibiousVehicle' < < endl ; } }; int main () { AmphibiousVehicle obj ; obj . waterInfo (); obj . landInfo (); return 0 ; }
Izlaz
This is an AmphibiousVehicle This is a WaterVehicle This is a LandVehicle
3. Višerazinsko nasljeđivanje
Višerazinsko nasljeđivanje u C++ znači da je klasa izvedena iz druge izvedene klase tvoreći lanac nasljeđivanja.
Multilevel Inheritance C++ #include using namespace std ; class Vehicle { public : Vehicle () { cout < < 'This is a Vehicle' < < endl ; } }; // Derived class from Vehicle class FourWheeler : public Vehicle { public : FourWheeler () { cout < < '4 Wheeler Vehicles' < < endl ; } }; // Derived class from FourWheeler class Car : public FourWheeler { public : Car () { cout < < 'This 4 Wheeler Vehicle is a Car' < < endl ; } }; int main () { Car obj ; return 0 ; }
Izlaz
This is a Vehicle 4 Wheeler Vehicles This 4 Wheeler Vehicle is a Car
4. Hijerarhijsko nasljeđivanje
U hijerarhijskom nasljeđivanju više od jedne podklase nasljeđuje se iz jedne osnovne klase. tj. više od jedne izvedene klase stvara se iz jedne osnovne klase. Na primjer, i automobili i autobusi su vozila.
Hierarchical Inheritance C++ #include using namespace std ; class Vehicle { public : Vehicle () { cout < < 'This is a Vehicle' < < endl ; } }; class Car : public Vehicle { public : Car () { cout < < 'This Vehicle is Car' < < endl ; } }; class Bus : public Vehicle { public : Bus () { cout < < 'This Vehicle is Bus' < < endl ; } }; int main () { Car obj1 ; Bus obj2 ; return 0 ; }
Izlaz
This is a Vehicle This Vehicle is Car This is a Vehicle This Vehicle is Bus
5. Hibridno nasljeđivanje
Kada se dvije ili više vrsta nasljeđivanja kombiniraju u jednom programu. Na primjer, klasa može koristiti višestruko nasljeđivanje i također biti dio višerazinskog lanca nasljeđivanja.
Hybrid Inheritance C++ #include using namespace std ; class Vehicle { public : Vehicle () { cout < < 'This is a Vehicle' < < endl ; } }; class Fare { public : Fare () { cout < < 'Fare of Vehicle' < < endl ; } }; class Car : public Vehicle { public : Car () { cout < < 'This Vehical is a Car' < < endl ; } }; class Bus : public Vehicle public Fare { public : Bus () { cout < < 'This Vehicle is a Bus with Fare' ; } }; int main () { Bus obj2 ; return 0 ; }
Izlaz
This is a Vehicle Fare of Vehicle This Vehicle is a Bus with Fare
Hibridno nasljeđe može dovesti do dijamantni problem u C++. To se događa kada klasa nasljeđuje dvije klase koje obje dijele istu osnovnu klasu. Kao rezultat toga, izvedena klasa dobiva višestruke kopije članova osnovne klase što stvara dvosmislenost oko toga koju koristiti.
Napomena: Rješenje je korištenje virtualnog nasljeđivanja tako da se dijeli samo jedna kopija osnovne klase.
Prednosti nasljeđivanja u C++
- Mogućnost ponovne upotrebe koda : Izvedena klasa može izravno ponovno koristiti članove podataka i metode svoje osnovne klase izbjegavajući dupliciranje koda.
- Apstrakcija: Podržava apstraktne klase (klase s čistim virtualnim funkcijama) koje definiraju zajedničko sučelje koje provodi apstrakciju.
- Hijerarhija klasa: Možete izgraditi hijerarhije (osnova → izvedeno → dalje izvedeno) za modeliranje odnosa u stvarnom svijetu.
- Polimorfizam: U potpunosti podržava polimorfizam vremena izvođenja putem virtualnih funkcija i također polimorfizam vremena kompajliranja putem preopterećenja funkcija i predložaka.
Nedostaci nasljeđivanja u C++
- Čvrsto spajanje: Klasa dijete postaje ovisna o klasi roditelju. Svaka promjena u osnovnoj klasi može nametnuti promjene u izvedenim klasama.
- Smanjena fleksibilnost: Ponekad se nasljeđivanje zlorabi tamo gdje bi sastav (ima-odnos) bio bolji što dovodi do manje fleksibilnog koda.
- Povećana složenost: Duboke hijerarhije nasljeđivanja (višerazinske ili hibridne) mogu učiniti kod teškim za razumijevanje održavanja i otklanjanja pogrešaka.
- Problem dijamanta: Kod hibridnog ili višestrukog nasljeđivanja može doći do dvosmislenosti ako se ista osnovna klasa nasljeđuje više puta.
- Opterećenje virtualnih funkcija: Ako se koristi polimorfizam (virtualne funkcije), dolazi do malog vremena izvođenja zbog traženja virtualne tablice.