V tomto článku sa dozviete o rôznych modeloch dedenia v programovaní v C ++: Viacnásobné, viacúrovňové a hierarchické dedenie s príkladmi.
Dedenie je jednou zo základných vlastností objektovo orientovaného programovacieho jazyka. Umožňuje vývojárom softvéru odvodiť novú triedu od existujúcej. Odvodená trieda dedí vlastnosti základnej triedy (existujúca trieda).
V programovaní v C ++ existujú rôzne modely dedičnosti.
Viacúrovňová dedičnosť v C ++
V programovaní v C ++ môžete nielen odvodiť triedu od základnej triedy, ale môžete tiež odvodiť triedu od odvodenej triedy. Táto forma dedičstva je známa ako viacúrovňové dedičstvo.
trieda A (…); trieda B: verejné A (…); trieda C: verejné B (… … …);
Tu je trieda B odvodená od základnej triedy A a trieda C je odvodená od odvodenej triedy B.
Príklad 1: Viacúrovňová dedičnosť C ++
#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; )
Výkon
Obsah základnej triedy.
V tomto programe je trieda C odvodená od triedy B (ktorá je odvodená od základnej triedy A).
Objekt obj triedy C je definovaný vo main()
funkcii.
Keď sa display()
funkcia volá, display()
vykoná sa v triede A. Je to preto, lebo display()
v triede C a triede B nie je žiadna funkcia.
Kompilátor najskôr hľadá display()
funkciu v triede C. Pretože tam funkcia neexistuje, hľadá funkciu v triede B (keďže C je odvodené od B).
Funkcia tiež neexistuje v triede B, takže kompilátor ju vyhľadáva v triede A (keďže B je odvodené od A).
Ak display()
funkcia existuje v C, kompilátor prepíše display()
triedu A (kvôli prepísaniu členskej funkcie).
C ++ viacnásobné dedenie
V programovaní v C ++ môže byť trieda odvodená od viac ako jedného rodiča. Napríklad: Trieda Bat je odvodená od základných tried Mammal a WingedAnimal. Dáva to zmysel, pretože netopier je cicavec aj okrídlené zviera.
Príklad 2: Viacnásobná dedičnosť v programovaní v 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; )
Výkon
Cicavce môžu rodiť priamo. Okrídlené zviera môže mávať.
Nejednoznačnosť vo viacerých dedičstvách
Najviditeľnejší problém s viacnásobným dedičstvom nastáva počas prepísania funkcie.
Predpokladajme, že dve základné triedy majú rovnakú funkciu, ktorá sa v odvodenej triede neprepíše.
Ak sa pokúsite zavolať funkciu pomocou objektu odvodenej triedy, kompilátor zobrazí chybu. Je to preto, že kompilátor nevie, ktorú funkciu má volať. Napríklad,
class base1 ( public: void someFunction( ) (… .… … . ) ); class base2 ( void someFunction( ) (… .… … . ) ); class derived : public base1, public base2 ( ); int main() ( derived obj; obj.someFunction() // Error! )
Tento problém je možné vyriešiť použitím funkcie rozlíšenia rozsahu na určenie, ktorá funkcia sa má zaradiť do triedy base1 alebo base2
int main () (obj.base1 :: someFunction (); // Funkcia triedy base1 sa nazýva obj.base2 :: someFunction (); // Funkcia triedy base2 sa volá.)
Hierarchická dedičnosť v C ++
Ak sa zo základnej triedy dedí viac ako jedna trieda, je to známe ako hierarchické dedičstvo. V hierarchickom dedičstve sú všetky funkcie, ktoré sú spoločné v podradených triedach, zahrnuté v základnej triede.
Napríklad: Fyzika, chémia, biológia sú odvodené z prírodovednej triedy.
Syntax hierarchickej dedičnosti
trieda base_class (…) trieda first_derived_class: verejná base_class (…) trieda second_derived_class: verejná base_class (…) trieda third_derived_class: verejná base_class (…)