Mantojums C++ valodā
Mantojums ir pamatjēdziens OOP (objektorientētā programmēšana) . Tas ir mehānisms, ar kuru vienai klasei ir atļauts mantot citas klases pazīmes (laukus un metodes). Mantojums nozīmē jaunu klašu izveidi, pamatojoties uz esošajām klasēm. Klase, kas manto no citas klases, var atkārtoti izmantot šīs klases metodes un laukus.
Piemērs: Nākamajā piemērā Dzīvnieks ir pamatklase, savukārt suns kaķis un govs ir atvasinātas klases, kas paplašina dzīvnieku klasi.
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 ; }
Izvade
Dog barks Cat meows Cow moos
Paskaidrojums:
- Dzīvnieks ir pamatklase ar funkciju sound().
- Suns Kaķis un Govs ir atvasinātas klases, katra definē savu skaņas () metodi.
- Galvenajā() suņa kaķa un govs objekti tiek veidoti atsevišķi.
- Kad mēs izsaucam sound() uz katra objekta, tiek palaista attiecīgā bērnu klases metode (Suns rej Kaķis ņaud Cow moos).
Sintakse
C++ class ChildClass : public ParentClass { // Additional fields and methods };
Kā mantošana darbojas programmā C++?
Kols (:) ar an piekļuves norādītājs tiek izmantots mantošanai C++ valodā. Tas ļauj atvasinātajai klasei (bērnu klasei) mantot bāzes klases (sākotnējās klases) datu dalībniekus (laukus) un dalībnieku funkcijas (metodes).
Kad klase manto citu klasi, tā iegūst visus pieejamos vecākklases dalībniekus, un arī pakārtotā klase var tos no jauna definēt (ignorēt) vai pievienot tiem jaunu funkcionalitāti.
Mantojuma veidi C++ valodā
Tālāk ir norādīti dažādi mantojuma veidi, kurus atbalsta C++.
1. Viena mantošana
Viena mantojuma gadījumā apakšklase tiek atvasināta tikai no vienas superklases. Tas pārmanto viena vecāka klases īpašības un uzvedību. Dažreiz to sauc arī par vienkāršu mantojumu.
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 ; }
Izvade
This is a Vehicle This Vehicle is Car
2. Daudzkārtēja mantošana
In Daudzkārtējs mantojums vienai klasei var būt vairāk nekā viena virsklase, un tā var mantot funkcijas no visām vecākklasēm.
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 ; }
Izvade
This is an AmphibiousVehicle This is a WaterVehicle This is a LandVehicle
3. Daudzlīmeņu mantošana
Daudzlīmeņu mantošana valodā C++ nozīmē, ka klase ir atvasināta no citas atvasinātas klases, kas veido mantojuma ķēdi.
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 ; }
Izvade
This is a Vehicle 4 Wheeler Vehicles This 4 Wheeler Vehicle is a Car
4. Hierarhiskā mantošana
Hierarhiskā mantojumā vairāk nekā viena apakšklase tiek mantota no vienas bāzes klases. i., no vienas bāzes klases tiek izveidotas vairāk nekā viena atvasināta klase. Piemēram, automašīnas un autobusi ir transporta līdzekļi.
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 ; }
Izvade
This is a Vehicle This Vehicle is Car This is a Vehicle This Vehicle is Bus
5. Hibrīda mantošana
Kad vienā programmā ir apvienoti divi vai vairāki mantojuma veidi. Piemēram, klase var izmantot vairāku mantojumu, kā arī būt daļa no daudzlīmeņu mantojuma ķēdes.
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 ; }
Izvade
This is a Vehicle Fare of Vehicle This Vehicle is a Bus with Fare
Hibrīda mantošana var izraisīt dimanta problēma valodā C++. Tas notiek, ja klase manto no divām klasēm, kurām abām ir viena un tā pati bāzes klase. Rezultātā atvasinātā klase iegūst vairākas bāzes klases dalībnieku kopijas, kas rada neskaidrības par to, kuru no tiem izmantot.
Piezīme: Risinājums ir izmantot virtuālo mantojumu, lai tiktu koplietota tikai viena bāzes klases kopija.
Mantojuma priekšrocības C++ valodā
- Koda atkārtota izmantošana : Atvasinātā klase var tieši atkārtoti izmantot savas bāzes klases datu elementus un metodes, izvairoties no koda dublēšanās.
- Abstrakcija: Atbalsta abstraktās klases (klases ar tīrām virtuālām funkcijām), kas nosaka kopīgu interfeisu, kas nodrošina abstrakciju.
- Klases hierarhija: Varat veidot hierarhijas (bāze → atvasināta → tālāk atvasināta), lai modelētu reālās pasaules attiecības.
- Polimorfisms: Pilnībā atbalsta izpildlaika polimorfismu, izmantojot virtuālās funkcijas, kā arī kompilēšanas laika polimorfismu, izmantojot funkciju pārslodzi un veidnes.
Mantojuma trūkumi C++ valodā
- Stingrs savienojums: Bērnu klase kļūst atkarīga no vecāku klases. Jebkuras izmaiņas bāzes klasē var piespiest izmaiņas atvasinātajās klasēs.
- Samazināta elastība: Dažreiz mantojums tiek ļaunprātīgi izmantots gadījumos, kad kompozīcija (ir-attiecība) būtu labāka, tādējādi radot mazāk elastīgu kodu.
- Paaugstināta sarežģītība: Dziļas mantojuma hierarhijas (daudzlīmeņu vai hibrīda) var apgrūtināt koda izpratni par uzturēšanu un atkļūdošanu.
- Dimanta problēma: Hibrīda vai vairāku mantojuma gadījumā var rasties neskaidrības, ja viena un tā pati bāzes klase tiek mantota vairākas reizes.
- Virtuālo funkciju pieskaitāmās izmaksas: Ja tiek izmantots polimorfisms (virtuālās funkcijas), virtuālās tabulas uzmeklēšanas dēļ ir neliela izpildlaika slodze.