Ebben a cikkben megismerheti az öröklés különböző modelljeit a C ++ programozásban: Több, többszintű és hierarchikus öröklődés példákkal.
Az öröklés az objektum-orientált programozási nyelv egyik alapvető jellemzője. Ez lehetővé teszi a szoftverfejlesztők számára, hogy új osztályt nyerjenek a meglévő osztályból. A levezetett osztály örökli az alaposztály (meglévő osztály) jellemzőit.
A C ++ programozásban az öröklés különböző modelljei vannak.
C ++ többszintű öröklés
A C ++ programozásban nemcsak az osztályból származhat, hanem a származtatott osztályból is. Az öröklésnek ezt a formáját többszintű öröklésnek nevezik.
A osztály (… ); B. osztály: A nyilvános (…); C osztály: B nyilvános (………);
Itt a B osztály az A alaposztályból származik, a C osztály pedig a származtatott B osztályból származik.
1. példa: C ++ többszintű öröklődés
#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; )
Kimenet
Alaposztály tartalma.
Ebben a programban a C osztály a B osztályból származik (amely az A alaposztályból származik).
A C osztály objekt objektumát a main()
függvény határozza meg .
A display()
függvény meghívásakor display()
az A osztályban végrehajtásra kerül. Azért, mert display()
a C és a B osztályban nincs funkció.
A fordító először a display()
C osztályban keresi a függvényt. Mivel a függvény ott nem létezik, a B osztályban lévő funkciót keresi (mivel C származik B-ből).
A függvény a B osztályban sem létezik, ezért a fordító az A osztályban keresi (mivel B származik A-ból).
Ha display()
a C-ben létezik függvény, a fordító felülbírálja display()
az A osztályt (a tagfüggvény felülírása miatt).
C ++ többszörös öröklés
A C ++ programozás során egy osztály több szülőtől származhat. Például: A denevér az emlősök és a szárnyasállatok alaposztályaiból származik. Ennek azért van értelme, mert a denevér emlős, valamint szárnyas állat.
2. példa: Többszörös öröklődés a C ++ programozásban
#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; )
Kimenet
Az emlősök közvetlenül szülhetnek. Szárnyas állat csapkodhat.
Kétértelműség a többszörös öröklésben
A többszörös örökléssel kapcsolatos legkézenfekvőbb probléma a funkció felülírása során jelentkezik.
Tegyük fel, hogy két alaposztálynak ugyanaz a funkciója, amelyet a származtatott osztály nem ír felül.
Ha megpróbálja meghívni a függvényt a származtatott osztály objektumával, a fordító hibát mutat. Ez azért van, mert a fordító nem tudja, melyik függvényt hívja meg. Például,
class base1 ( public: void someFunction( ) (… .… … . ) ); class base2 ( void someFunction( ) (… .… … . ) ); class derived : public base1, public base2 ( ); int main() ( derived obj; obj.someFunction() // Error! )
Ez a probléma megoldható a hatókör-felbontási függvény segítségével annak megadásához, hogy melyik függvényt kell osztályozni az base1 vagy a base2 osztályba
int main () (obj.base1 :: someFunction (); // Az base1 osztály függvényét obj.base2 :: someFunction (); // base2 osztály függvényét hívjuk meg.)
C ++ hierarchikus öröklés
Ha egynél több osztályt örökölnek az alaposztályból, akkor ezt hierarchikus öröklésnek nevezik. A hierarchikus öröklésben az összes osztály, amely a gyermekosztályokban gyakori, az alaposztályba tartozik.
Például: A fizika, a kémia, a biológia a természettudományi osztályból származik.
A hierarchikus öröklés szintaxisa
class base_class (…) class first_derived_class: public base_class (…) class second_derived_class: public base_class (…) class third_derived_class: public base_class (…)