Paveldėjimas C++
Paveldėjimas yra pagrindinė sąvoka OOP (objektinis programavimas) . Tai mechanizmas, kuriuo vienai klasei leidžiama paveldėti kitos klasės ypatybes (laukus ir metodus). Paveldėjimas reiškia naujų klasių kūrimą remiantis esamomis. Klasė, kuri paveldima iš kitos klasės, gali pakartotinai naudoti tos klasės metodus ir laukus.
Pavyzdys: Toliau pateiktame pavyzdyje Gyvūnas yra pagrindinė klasė, o šunų katė ir karvė yra išvestinės klasės, kurios praplečia gyvūnų klasę.
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 ; }
Išvestis
Dog barks Cat meows Cow moos
Paaiškinimas:
- Gyvūnas yra pagrindinė klasė su funkcija sound().
- „Dog Cat“ ir „Cow“ yra išvestinės klasės, kiekviena apibrėžianti savo garso () metodą.
- Pagrindiniame() šunų katės ir karvės objektai kuriami atskirai.
- Kai iškviečiame garsą () kiekviename objekte, paleidžiamas atitinkamas antrinės klasės metodas (šuo loja Katė miauka karvė moos).
Sintaksė
C++ class ChildClass : public ParentClass { // Additional fields and methods };
Kaip paveldėjimas veikia C++?
Dvitaškis (:) su an prieigos specifikatorius naudojamas paveldėjimui C++. Tai leidžia išvestinei klasei (antrinei klasei) paveldėti bazinės klasės (pagrindinės klasės) duomenų narius (laukus) ir narių funkcijas (metodus).
Kai klasė paveldi kitą klasę, ji gauna visus pasiekiamus pagrindinės klasės narius, o antrinė klasė taip pat gali iš naujo apibrėžti (nepaisyti) arba pridėti prie jų naujų funkcijų.
Paveldėjimo tipai C++
Žemiau pateikiami įvairūs paveldėjimo tipai, kuriuos palaiko C++.
1. Vienkartinis paveldėjimas
Vieno paveldėjimo atveju poklasis yra kilęs tik iš vienos superklasės. Jis paveldi vienos iš tėvų klasės savybes ir elgesį. Kartais tai taip pat žinoma kaip paprastas paveldėjimas.
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 ; }
Išvestis
This is a Vehicle This Vehicle is Car
2. Daugybinis paveldėjimas
Į Daugialypis paveldėjimas viena klasė gali turėti daugiau nei vieną superklasę ir paveldėti funkcijas iš visų pirminių klasių.
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 ; }
Išvestis
This is an AmphibiousVehicle This is a WaterVehicle This is a LandVehicle
3. Daugiapakopis paveldėjimas
Daugiapakopis paveldėjimas C++ reiškia, kad klasė yra kilusi iš kitos išvestinės klasės, sudarančios paveldėjimo grandinę.
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 ; }
Išvestis
This is a Vehicle 4 Wheeler Vehicles This 4 Wheeler Vehicle is a Car
4. Hierarchinis paveldėjimas
Hierarchinio paveldėjimo atveju daugiau nei vienas poklasis yra paveldimas iš vienos bazinės klasės. y., iš vienos bazinės klasės sukuriama daugiau nei viena išvestinė klasė. Pavyzdžiui, automobiliai ir autobusai yra transporto priemonės.
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 ; }
Išvestis
This is a Vehicle This Vehicle is Car This is a Vehicle This Vehicle is Bus
5. Hibridinis paveldėjimas
Kai vienoje programoje sujungiami du ar daugiau paveldėjimo rūšių. Pavyzdžiui, klasė gali naudoti daugialypį paveldėjimą ir taip pat būti kelių lygių paveldėjimo grandinės dalimi.
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 ; }
Išvestis
This is a Vehicle Fare of Vehicle This Vehicle is a Bus with Fare
Hibridinis paveldėjimas gali sukelti deimantų problema C++ kalboje. Taip atsitinka, kai klasė paveldi iš dviejų klasių, kurios abi turi tą pačią bazinę klasę. Dėl to išvestinė klasė gauna kelias bazinės klasės narių kopijas, todėl kyla neaiškumų, kurį iš jų naudoti.
Pastaba: Sprendimas yra naudoti virtualų paveldėjimą, kad būtų bendrinama tik viena pagrindinės klasės kopija.
Paveldėjimo privalumai C++
- Kodo pakartotinis naudojimas : Išvestinė klasė gali tiesiogiai pakartotinai naudoti savo bazinės klasės duomenų narius ir metodus, išvengiant kodo dubliavimo.
- Abstrakcija: Palaiko abstrakčias klases (klases su grynomis virtualiomis funkcijomis), kurios apibrėžia bendrą sąsają, užtikrinančią abstrakciją.
- Klasės hierarchija: Galite sukurti hierarchijas (bazė → išvestinė → toliau išvestinė), kad modeliuotumėte realaus pasaulio ryšius.
- Polimorfizmas: Visiškai palaiko vykdymo laiko polimorfizmą per virtualias funkcijas ir kompiliavimo laiko polimorfizmą per funkcijų perkrovą ir šablonus.
C++ paveldėjimo trūkumai
- Tvirtas sujungimas: Vaikų klasė tampa priklausoma nuo tėvų klasės. Bet koks bazinės klasės pakeitimas gali priversti pakeisti išvestines klases.
- Sumažintas lankstumas: Kartais paveldėjimas naudojamas netinkamai, kai sudėtis (santykis turi) būtų geriau, todėl kodas būtų mažiau lankstus.
- Padidėjęs sudėtingumas: Dėl gilios paveldėjimo hierarchijos (daugiapakopių arba hibridinių) kodo priežiūra ir derinimas gali būti sunkiai suprantamas.
- Deimantų problema: Hibridinio ar daugybinio paveldėjimo atveju gali atsirasti dviprasmybių, jei ta pati bazinė klasė paveldima kelis kartus.
- Virtualių funkcijų pridėtinė vertė: Jei naudojamas polimorfizmas (virtualios funkcijos), dėl virtualios lentelės peržvalgų susidaro nedidelė vykdymo trukmė.