C ++ meervoudige, multilevel en hiërarchische overerving

In dit artikel leer je over verschillende overervingsmodellen in C ++ -programmering: meervoudige, multilevel en hiërarchische overerving met voorbeelden.

Overerving is een van de belangrijkste kenmerken van een objectgeoriënteerde programmeertaal. Hiermee kunnen softwareontwikkelaars een nieuwe klasse afleiden uit de bestaande klasse. De afgeleide klasse erft de kenmerken van de basisklasse (bestaande klasse).

Er zijn verschillende overervingsmodellen in C ++ -programmering.

C ++ Overerving op meerdere niveaus

Bij C ++ - programmeren kunt u niet alleen een klasse afleiden uit de basisklasse, maar u kunt ook een klasse afleiden uit de afgeleide klasse. Deze vorm van overerving staat bekend als overerving op meerdere niveaus.

klasse A, eerste klasse (… ); klasse B: openbaar A (…); klasse C: openbaar B (………);

Hier is klasse B afgeleid van de basisklasse A en is de klasse C afgeleid van de afgeleide klasse B.

Voorbeeld 1: C ++ Overerving op meerdere niveaus

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

Uitvoer

 Basisklasse inhoud.

In dit programma is klasse C afgeleid van klasse B (die is afgeleid van basisklasse A).

Het object obj van klasse C wordt gedefinieerd in de main()functie.

Wanneer de display()functie wordt aangeroepen, wordt display()in klasse A uitgevoerd. Het is omdat er geen display()functie is in klasse C en klasse B.

De compiler zoekt eerst naar de display()functie in klasse C. Omdat de functie daar niet bestaat, zoekt hij naar de functie in klasse B (aangezien C is afgeleid van B).

De functie bestaat ook niet in klasse B, dus de compiler zoekt ernaar in klasse A (omdat B is afgeleid van A).

Als de display()functie in C bestaat, overschrijft de compiler display()klasse A (vanwege het overschrijven van de lidfunctie).

C ++ meervoudige overerving

Bij C ++ - programmeren kan een klas worden afgeleid van meer dan één ouder. Bijvoorbeeld: Een klasse Bat is afgeleid van de basisklassen Mammal en WingedAnimal. Het is logisch, want vleermuis is zowel een zoogdier als een gevleugeld dier.

Voorbeeld 2: meervoudige overerving bij programmeren in C ++

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

Uitvoer

Zoogdieren kunnen direct baren. Gevleugeld dier kan flapperen.

Dubbelzinnigheid bij meervoudige overerving

Het meest voor de hand liggende probleem met meervoudige overerving doet zich voor tijdens het overschrijven van functies.

Stel dat twee basisklassen dezelfde functie hebben die niet wordt overschreven in een afgeleide klasse.

Als u de functie probeert aan te roepen met het object van de afgeleide klasse, geeft de compiler een fout weer. Het is omdat de compiler niet weet welke functie moet worden aangeroepen. Bijvoorbeeld,

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

Dit probleem kan worden opgelost met behulp van de scope-resolutiefunctie om aan te geven welke functie moet worden geclassificeerd als base1 of base2

 int main () (obj.base1 :: someFunction (); // Functie van klasse base1 heet obj.base2 :: someFunction (); // Functie van klasse base2 wordt aangeroepen.)

C ++ hiërarchische overerving

Als er meer dan één klasse wordt overgenomen van de basisklasse, staat dit bekend als hiërarchische overerving. Bij hiërarchische overerving worden alle functies die veel voorkomen in onderliggende klassen, opgenomen in de basisklasse.

Bijvoorbeeld: natuurkunde, scheikunde en biologie zijn afgeleid van de Science-klasse.

Syntaxis van hiërarchische overerving

 class base_class (…) class first_derived_class: public base_class (…) class second_derived_class: public base_class (…) class third_derived_class: public base_class (…)

Interessante artikelen...