V tem članku boste spoznali različne modele dedovanja v programiranju na C ++: večplastno, večnivojsko in hierarhično dedovanje s primeri.
Dedovanje je ena glavnih značilnosti objektno usmerjenega programskega jezika. Razvijalcem programske opreme omogoča, da iz obstoječega razreda izpeljejo nov razred. Izpeljani razred podeduje lastnosti osnovnega razreda (obstoječi razred).
V programiranju na C ++ obstajajo različni modeli dedovanja.
Dedovanje na več ravneh C ++
Pri programiranju na C ++ lahko iz osnovnega razreda izpeljete ne samo razred, temveč tudi razred iz izpeljanega razreda. Ta oblika dedovanja je znana kot dedovanje na več ravneh.
razred A (…); razred B: javni A (…); razred C: javni B (………);
Tu razred B izhaja iz osnovnega razreda A, razred C pa iz izvedenega razreda B.
Primer 1: Dedovanje na več ravneh 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; )
Izhod
Vsebina osnovnega razreda.
V tem programu razred C izhaja iz razreda B (ki izhaja iz osnovnega razreda A).
Objekt razreda C je definiran v main()
funkciji.
Ko je display()
funkcija poklicana, se display()
v razredu A izvede. To je zato, ker display()
v razredu C in razredu B ni funkcije
Prevajalnik najprej poišče display()
funkcijo v razredu C. Ker funkcija tam ne obstaja, poišče funkcijo v razredu B (saj C izhaja iz B).
Funkcija tudi ne obstaja v razredu B, zato jo prevajalnik išče v razredu A (saj B izhaja iz A).
Če display()
funkcija obstaja v C, prevajalnik preglasi display()
razred A (zaradi preglasitve funkcije člana).
C ++ večkratno dedovanje
Pri programiranju na C ++ lahko razred izpelje več staršev. Na primer: Razred Bat izhaja iz osnovnih razredov Mammal in WingedAnimal. Smiselno je, ker je netopir sesalec in tudi krilata žival.
Primer 2: Večkratno dedovanje pri programiranju na 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; )
Izhod
Sesalci lahko rodijo neposredno. Krilata žival se lahko zavihti.
Dvoumnost pri večkratnem dedovanju
Najbolj očitna težava z večkratnim dedovanjem se pojavi med razveljavitvijo funkcije.
Recimo, da imata dva osnovna razreda isto funkcijo, ki je v izpeljanem razredu ni mogoče preglasiti.
Če poskušate funkcijo poklicati z objektom izpeljanega razreda, prevajalnik pokaže napako. To je zato, ker prevajalnik ne ve, katero funkcijo naj pokliče. Na primer
class base1 ( public: void someFunction( ) (… .… … . ) ); class base2 ( void someFunction( ) (… .… … . ) ); class derived : public base1, public base2 ( ); int main() ( derived obj; obj.someFunction() // Error! )
To težavo je mogoče rešiti s pomočjo funkcije ločljivosti obsega, da določite, katero funkcijo razvrstite v bazo1 ali bazo2
int main () (obj.base1 :: someFunction (); // Funkcija razreda base1 se imenuje obj.base2 :: someFunction (); // imenuje se funkcija razreda base2.)
C ++ hierarhična dediščina
Če je iz osnovnega razreda podedovanih več razredov, je to znano kot hierarhično dedovanje. Pri hierarhičnem dedovanju so v osnovni razred vključene vse značilnosti, ki so pogoste v podrejenih razredih.
Na primer: fizika, kemija in biologija izhajajo iz predavanja naravoslovja.
Sintaksa hierarhične dediščine
class base_class (…) class first_derived_class: public base_class (…) class second_derived_class: public base_class (…) class third_derived_class: public base_class (…)