V tomto článku se dozvíte o různých modelech dědičnosti v programování v C ++: Vícenásobné, víceúrovňové a hierarchické dědičnosti s příklady.
Dědičnost je jednou ze základních vlastností objektově orientovaného programovacího jazyka. Umožňuje vývojářům softwaru odvodit novou třídu od stávající třídy. Odvozená třída dědí funkce základní třídy (existující třída).
V programování v C ++ existují různé modely dědičnosti.
Víceúrovňová dědičnost v C ++
V programování v C ++ můžete nejen odvodit třídu ze základní třídy, ale můžete také odvodit třídu z odvozené třídy. Tato forma dědictví je známá jako víceúrovňové dědictví.
třída A (…); třída B: veřejná A (…); třída C: veřejná B (………);
Zde je třída B odvozena od základní třídy A a třída C je odvozena od odvozené třídy B.
Příklad 1: Víceúrovňová dědičnost 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ýstup
Obsah základní třídy.
V tomto programu je třída C odvozena od třídy B (která je odvozena od základní třídy A).
Objekt obj třídy C je definován ve main()
funkci.
Při display()
volání funkce se display()
ve třídě A provede. Je to proto, že display()
ve třídě C a třídě B není žádná funkce.
Kompilátor nejprve hledá display()
funkci ve třídě C. Protože tam funkce neexistuje, hledá funkci ve třídě B (protože C je odvozeno od B).
Funkce také neexistuje ve třídě B, takže ji kompilátor hledá ve třídě A (protože B je odvozeno od A).
Pokud display()
funkce existuje v C, přepíše kompilátor display()
třídy A (z důvodu přepsání členské funkce).
C ++ vícenásobná dědičnost
V programování v C ++ může být třída odvozena od více než jednoho rodiče. Například: Třída Bat je odvozena od základních tříd Mammal a WingedAnimal. Dává to smysl, protože netopýr je savec i okřídlené zvíře.
Příklad 2: Vícenásobná dědičnost v programování 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ýstup
Savci mohou rodit přímo. Okřídlené zvíře může mávat.
Nejednoznačnost ve více dědičnosti
Nejviditelnější problém s vícenásobnou dědičností nastává během přepsání funkce.
Předpokládejme, že dvě základní třídy mají stejnou funkci, která není v odvozené třídě přepsána.
Pokud se pokusíte zavolat funkci pomocí objektu odvozené třídy, kompilátor zobrazí chybu. Je to proto, že kompilátor neví, kterou funkci má volat. Napří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 lze vyřešit pomocí funkce rozlišení oboru k určení, kterou funkci zařadit do třídy base1 nebo base2
int main () (obj.base1 :: someFunction (); // Funkce třídy base1 se nazývá obj.base2 :: someFunction (); // Funkce třídy base2 se nazývá.)
C ++ hierarchická dědičnost
Pokud se ze základní třídy dědí více než jedna třída, je to známé jako hierarchická dědičnost. V hierarchické dědičnosti jsou všechny funkce, které jsou společné v podřízených třídách, zahrnuty do základní třídy.
Například: Fyzika, Chemie, Biologie jsou odvozeny ze třídy Věda.
Syntaxe hierarchické dědičnosti
třída base_class (…) třída first_derived_class: veřejná base_class (…) třída second_derived_class: veřejná base_class (…) třída third_derived_class: veřejná base_class (…)