C ++ daudzkārtējs, daudzlīmeņu un hierarhisks mantojums

Šajā rakstā jūs uzzināsiet par dažādiem mantojuma modeļiem C ++ programmēšanā: vairāku, daudzlīmeņu un hierarhisku mantojumu ar piemēriem.

Mantošana ir viena no objektorientētās programmēšanas valodas galvenajām iezīmēm. Tas ļauj programmatūras izstrādātājiem iegūt jaunu klasi no esošās klases. Atvasinātā klase pārmanto bāzes klases (esošās klases) pazīmes.

C ++ programmēšanā ir dažādi mantojuma modeļi.

C ++ daudzlīmeņu mantojums

Programmējot C ++, klasi var atvasināt ne tikai no pamatklases, bet arī no atvasinātās klases. Šis mantojuma veids ir pazīstams kā daudzlīmeņu mantojums.

A klase (…); B klase: publiska A (…); C klase: publiskā B (………);

Šeit B klase ir atvasināta no A bāzes klases un C klase ir atvasināta B klase.

1. piemērs: C ++ daudzlīmeņu mantojums

 #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; )

Rezultāts

 Bāzes klases saturs.

Šajā programmā C klase ir atvasināta no B klases (kas atvasināta no A bāzes klases).

C klases obj objekts ir definēts main()funkcijā.

Kad display()funkcija tiek izsaukta, display()A klasē tiek izpildīta. Tas ir tāpēc, ka display()C un B klasē nav funkciju.

Sastādītājs vispirms meklē display()funkciju C klasē. Tā kā funkcija tur nepastāv, tā meklē funkciju B klasē (tā kā C atvasināts no B).

Funkcija nepastāv arī B klasē, tāpēc kompilators to meklē A klasē (jo B ir atvasināts no A).

Ja display()funkcija C pastāv, kompilators ignorē display()A klasi (dalībnieka funkcijas ignorēšanas dēļ).

C ++ vairākkārtēja mantošana

Programmā C ++ klasi var atvasināt no vairākiem vecākiem. Piemēram: Klases sikspārnis tiek iegūts no pamatklasēm Zīdītāji un Spārnotie dzīvnieki. Tam ir jēga, jo sikspārnis ir zīdītājs, kā arī spārnots dzīvnieks.

2. piemērs: vairākkārtēja mantošana C ++ programmēšanā

 #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; ) 

Rezultāts

Zīdītāji var tieši dzemdēt. Spārnotais dzīvnieks var atlocīt.

Neskaidrība daudzkārtējā mantojumā

Visredzamākā vairāku mantojumu problēma rodas, ignorējot funkciju.

Pieņemsim, ka divām bāzes klasēm ir viena un tā pati funkcija, kas netiek ignorēta atvasinātajā klasē.

Ja mēģināt izsaukt funkciju, izmantojot atvasinātās klases objektu, kompilators parāda kļūdu. Tas ir tāpēc, ka kompilators nezina, kuru funkciju izsaukt. Piemēram,

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

Šo problēmu var atrisināt, izmantojot darbības jomas izšķirtspējas funkciju, lai norādītu, kura funkcija jāklasē vai nu bāzes1, vai bāzes2

 int main () (obj.base1 :: someFunction (); // klases base1 funkciju sauc obj.base2 :: someFunction (); // tiek izsaukta klases base2 funkcija.)

C ++ hierarhiskā mantošana

Ja no bāzes klases tiek mantota vairāk nekā viena klase, to sauc par hierarhisku mantojumu. Hierarhiskajā mantojumā visas pazīmes, kas ir kopīgas bērnu klasēs, tiek iekļautas pamata klasē.

Piemēram: Fizika, ķīmija, bioloģija ir iegūti no Zinātnes klases.

Hierarhiskā mantojuma sintakse

 klases bāzes_klases (…) klases pirmās_nodalītās_klases: publiskās bāzes_klases (…) klases otrās_nodalītās_klases: publiskās bāzes_klases (…) klases trešās_atdalītās_klases: publiskās bāzes_klases (…)

Interesanti raksti...