Ц ++ Вишеструко, вишеразинско и хијерархијско наслеђивање

У овом чланку ћете научити о различитим моделима наслеђивања у програмирању на Ц ++: вишеструко, вишеразинско и хијерархијско наслеђивање са примерима.

Наслеђивање је једна од основних карактеристика објектно оријентисаног програмског језика. Омогућава програмерима да изведу нову класу из постојеће класе. Изведена класа наслеђује особине основне класе (постојеће класе).

У Ц ++ програмирању постоје различити модели наслеђивања.

Ц ++ вишеразинско наслеђивање

У програмирању на Ц ++, не само да можете извести класу из основне класе, већ можете извести и класу из изведене класе. Овај облик наследства познат је под називом наследство на више нивоа.

класа А (…); разред Б: јавни А (…); разред Ц: јавни Б (………);

Овде је класа Б изведена из основне класе А, а класа Ц изведена је из изведене класе Б.

Пример 1: Ц ++ вишеразинско наследство

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

Оутпут

 Садржај основне класе.

У овом програму, класа Ц је изведена из класе Б (која је изведена из основне класе А).

Објект класе Ц дефинисан је у main()функцији.

Када се display()функција позове, display()у класи А се извршава. То је зато што не постоји display()функција у класи Ц и класи Б.

Компајлер прво тражи display()функцију у класи Ц. Пошто функција тамо не постоји, тражи функцију у класи Б (јер је Ц изведено из Б).

Функција такође не постоји у класи Б, па је преводилац тражи у класи А (јер је Б изведено из А).

Ако display()функција постоји у Ц, компајлер поништава display()класу А (због замене функције члана).

Ц ++ Вишеструко наслеђивање

У програмирању на Ц ++, класа се може извести од више родитеља. На пример: Класа Слепи миш изведена је из основних класа Сисари и ВингедАнимал. Има смисла јер је слепи миш и сисавац и крилата животиња.

Пример 2: Вишеструко наслеђивање у програмирању на Ц ++

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

Оутпут

Сисари могу директно родити. Крилата животиња може да се замахне.

Двосмисленост у вишеструком наслеђивању

Најочигледнији проблем са вишеструким наслеђивањем јавља се током замене функције.

Претпоставимо да две основне класе имају исту функцију која није замењена у изведеној класи.

Ако покушате да позовете функцију помоћу објекта изведене класе, компајлер приказује грешку. То је зато што компајлер не зна коју функцију да позове. На пример,

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

Овај проблем се може решити помоћу функције резолуције опсега да бисте одредили коју функцију да класификујете басе1 или басе2

 инт маин () (обј.басе1 :: сомеФунцтион (); // Функција класе басе1 назива се обј.басе2 :: сомеФунцтион (); // позива се функција класе басе2.)

Ц ++ Хијерархијско наслеђивање

Ако се више од једне класе наслеђује из основне класе, то је познато као хијерархијско наслеђивање. У хијерархијском наслеђивању, све карактеристике које су уобичајене у подређеним класама су укључене у основну класу.

На пример: Физика, Хемија и Биологија су изведени из часа природних наука.

Синтакса хијерархијског наслеђивања

 цласс басе_цласс (…) цласс фирст_деривед_цласс: публиц басе_цласс (…) цласс сецонд_деривед_цласс: публиц басе_цласс (…) цласс тхирд_деривед_цласс: публиц басе_цласс (…)

Занимљиви Чланци...