Dedovanje v C++
Dedovanje je temeljni koncept v OOP (objektno usmerjeno programiranje) . Je mehanizem, s katerim lahko en razred podeduje lastnosti (polja in metode) drugega razreda. Dedovanje pomeni ustvarjanje novih razredov na podlagi obstoječih. Razred, ki deduje od drugega razreda, lahko znova uporabi metode in polja tega razreda.
primer: V naslednjem primeru je Animal osnovni razred, Dog Cat in Cow pa sta izpeljana razreda, ki razširjata razred 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 ; }
Izhod
Dog barks Cat meows Cow moos
Pojasnilo:
- Animal je osnovni razred s funkcijo sound().
- Dog Cat in Cow sta izpeljana razreda, ki definirata vsak svojo metodo sound().
- V main() se objekti Dog Cat in Cow ustvarijo ločeno.
- Ko pokličemo sound() za vsak objekt, se izvaja ustrezna metoda podrejenega razreda (pes laja, mačka mijavka, krava muka).
Sintaksa
C++ class ChildClass : public ParentClass { // Additional fields and methods };
Kako deluje dedovanje v C++?
Dvopičje (:) z an specifikator dostopa se uporablja za dedovanje v C++. Izpeljanemu razredu (podrejenemu razredu) omogoča podedovanje podatkovnih članov (polj) in članskih funkcij (metod) osnovnega razreda (nadrejenega razreda).
Ko razred podeduje drug razred, dobi vse dostopne člane nadrejenega razreda, podrejeni razred pa jih lahko tudi na novo definira (preglasi) ali jim doda novo funkcionalnost.
Vrste dedovanja v C++
Spodaj so različne vrste dedovanja, ki jih podpira C++.
1. Enojno dedovanje
Pri enojnem dedovanju je podrazred izpeljan samo iz enega nadrazreda. Podeduje lastnosti in obnašanje enostarševskega razreda. Včasih je znano tudi kot preprosto dedovanje.
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 ; }
Izhod
This is a Vehicle This Vehicle is Car
2. Večkratno dedovanje
noter Večkratno dedovanje en razred ima lahko več kot en nadrazred in podeduje lastnosti vseh nadrejenih razredov.
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 ; }
Izhod
This is an AmphibiousVehicle This is a WaterVehicle This is a LandVehicle
3. Večnivojsko dedovanje
Večnivojsko dedovanje v C++ pomeni, da je razred izpeljan iz drugega izpeljanega razreda, ki tvori verigo dedovanja.
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 ; }
Izhod
This is a Vehicle 4 Wheeler Vehicles This 4 Wheeler Vehicle is a Car
4. Hierarhično dedovanje
Pri hierarhičnem dedovanju je več kot en podrazred podedovan iz enega osnovnega razreda. tj. več kot en izpeljani razred je ustvarjen iz enega osnovnega razreda. Na primer, avtomobili in avtobusi so 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 ; }
Izhod
This is a Vehicle This Vehicle is Car This is a Vehicle This Vehicle is Bus
5. Hibridno dedovanje
Ko sta dve ali več vrst dedovanja združena v enem programu. Razred lahko na primer uporablja večkratno dedovanje in je tudi del večnivojske verige dedovanja.
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 ; }
Izhod
This is a Vehicle Fare of Vehicle This Vehicle is a Bus with Fare
Hibridno dedovanje lahko vodi do diamantni problem v C++. To se zgodi, ko razred deduje od dveh razredov, ki si delita isti osnovni razred. Posledično dobi izpeljani razred več kopij članov osnovnega razreda, kar ustvarja dvoumnost glede tega, katerega uporabiti.
Opomba: Rešitev je uporaba navideznega dedovanja, tako da je v skupni rabi samo ena kopija osnovnega razreda.
Prednosti dedovanja v C++
- Ponovna uporabnost kode : Izpeljani razred lahko neposredno ponovno uporabi podatkovne člane in metode svojega osnovnega razreda, pri čemer se izogne podvajanju kode.
- Abstrakcija: Podpira abstraktne razrede (razrede s čisto virtualnimi funkcijami), ki definirajo skupni vmesnik, ki uveljavlja abstrakcijo.
- Hierarhija razreda: Gradite lahko hierarhije (osnovno → izpeljano → nadaljnje izpeljano) za modeliranje odnosov v resničnem svetu.
- polimorfizem: Popolnoma podpira polimorfizem med izvajanjem prek virtualnih funkcij in tudi polimorfizem med prevajanjem prek preobremenitve funkcij in predlog.
Slabosti dedovanja v C++
- Tesna povezava: Podrejeni razred postane odvisen od nadrejenega razreda. Vsaka sprememba v osnovnem razredu lahko povzroči spremembe v izpeljanih razredih.
- Zmanjšana prožnost: Včasih je dedovanje zlorabljeno, kjer bi bila sestava (ima-razmerje) boljša, kar vodi do manj prilagodljive kode.
- Povečana kompleksnost: Globoke hierarhije dedovanja (večnivojske ali hibridne) lahko povzročijo, da je koda težko razumljiva pri vzdrževanju in odpravljanju napak.
- Problem z diamanti: Pri hibridnem ali večkratnem dedovanju lahko pride do dvoumnosti, če je isti osnovni razred podedovan večkrat.
- Stroški virtualnih funkcij: Če se uporablja polimorfizem (navidezne funkcije), je zaradi iskanja navidezne tabele majhen čas izvajanja.