C ++ moni-, monitasoinen ja hierarkkinen perintö

Tässä artikkelissa opit erilaisista perintömalleista C ++ -ohjelmoinnissa: moninkertainen, monitasoinen ja hierarkkinen perintö esimerkkien avulla.

Perintö on yksi olio-ohjelmointikielen ydinominaisuuksia. Sen avulla ohjelmistokehittäjät voivat johtaa uuden luokan olemassa olevaan luokkaan. Johdettu luokka perii perusluokan (olemassa olevan luokan) ominaisuudet.

C ++ - ohjelmoinnissa on erilaisia ​​perintömalleja.

C ++ Monitasoinen perintö

C ++ - ohjelmoinnissa voit paitsi johtaa luokan myös perusluokasta, mutta voit myös johtaa luokan johdetusta luokasta. Tätä perintömuotoa kutsutaan monitasoiseksi perinnöksi.

luokka A (…); luokka B: julkinen A (…); luokka C: julkinen B (………);

Täällä luokka B on johdettu perusluokasta A ja luokka C on johdettu johdetusta luokasta B.

Esimerkki 1: C ++ monitasoinen perintö

 #include using namespace std; class A ( public: void display() ( cout<<"Base class content."; ) ); class B : public A ( ); class C : public B ( ); int main() ( C obj; obj.display(); return 0; )

Tuotos

 Perusluokan sisältö.

Tässä ohjelmassa luokka C on johdettu luokasta B (joka on johdettu perusluokasta A).

Luokan C objektiobjekti on määritelty main()funktiossa.

Kun display()funktio kutsutaan, display()luokka A suoritetaan. Se johtuu siitä, että display()C- ja B-luokassa ei ole toimintoa.

Kääntäjä etsii ensin display()funktion luokassa C. Koska toimintoa ei ole olemassa, se etsii funktiota luokassa B (koska C on johdettu B: stä).

Funktiota ei myöskään ole luokassa B, joten kääntäjä etsii sitä luokassa A (koska B on johdettu A: sta).

Jos display()C: ssä on toiminto, kääntäjä ohittaa display()luokan A ( jäsenfunktion ohittamisen vuoksi).

C ++ moninkertainen perintö

C ++ - ohjelmoinnissa luokka voidaan johtaa useammasta kuin yhdestä vanhemmasta. Esimerkiksi: Luokka-lepakko on johdettu perusluokista Nisäkäs ja Siipikarja. Se on järkevää, koska lepakko on sekä nisäkäs että siivekäs eläin.

Esimerkki 2: Moninkertainen perintö C ++ -ohjelmoinnissa

 #include using namespace std; class Mammal ( public: Mammal() ( cout << "Mammals can give direct birth." << endl; ) ); class WingedAnimal ( public: WingedAnimal() ( cout << "Winged animal can flap." << endl; ) ); class Bat: public Mammal, public WingedAnimal ( ); int main() ( Bat b1; return 0; ) 

Tuotos

Nisäkkäät voivat synnyttää suoraan. Siivekäs eläin voi läppä.

Moniselitteisyys moninkertaisessa perinnössä

Useimpien perintöjen ilmeisin ongelma ilmenee toiminnon ohittamisen aikana.

Oletetaan, että kahdella perusluokalla on sama tehtävä, jota ei ohiteta johdetussa luokassa.

Jos yrität kutsua funktiota käyttämällä johdetun luokan objektia, kääntäjä näyttää virheen. Se johtuu siitä, että kääntäjä ei tiedä mitä toimintoa soittaa. Esimerkiksi,

 class base1 ( public: void someFunction( ) (… .… … . ) ); class base2 ( void someFunction( ) (… .… … . ) ); class derived : public base1, public base2 ( ); int main() ( derived obj; obj.someFunction() // Error! )  

Tämä ongelma voidaan ratkaista käyttämällä tarkkuustarkkuustoimintoa määrittämään mikä funktio luokalle joko base1 tai base2

 int main () (obj.base1 :: someFunction (); // base1-luokan funktiota kutsutaan obj.base2 :: someFunction (); // base2-luokan funktiota kutsutaan.)

C ++ hierarkkinen perintö

Jos perusluokasta peritään useampi kuin yksi luokka, sitä kutsutaan hierarkkiseksi perinnöksi. Hierarkkisessa perinnössä kaikki lapsiluokissa yleiset ominaisuudet sisältyvät perusluokkaan.

Esimerkiksi: Fysiikka, kemia, biologia ovat peräisin luonnontieteiden luokasta.

Hierarkkisen perinnön syntaksi

 luokan perustunnus (…) luokan ensimmäinen_jätetty_luokka: julkinen tukiaseman_luokka (…) luokan toinen

Mielenkiintoisia artikkeleita...