В тази статия ще научите за различни модели на наследяване в програмирането на C ++: Множествено, многостепенно и йерархично наследяване с примери.
Наследяването е една от основните характеристики на обектно-ориентирания език за програмиране. Той позволява на разработчиците на софтуер да извлекат нов клас от съществуващия клас. Полученият клас наследява характеристиките на базовия клас (съществуващ клас).
Съществуват различни модели на наследяване в програмирането на C ++.
Наследяване на C ++ на много нива
В програмирането на C ++ не само можете да извлечете клас от базовия клас, но можете да извлечете и клас от производния клас. Тази форма на наследяване е известна като наследяване на много нива.
клас А (…); клас B: публичен A (…); клас C: публичен B (………);
Тук клас B е получен от базовия клас A, а клас C е получен от производния клас B.
Пример 1: Наследяване на много нива 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; )
Изход
Съдържание на базовия клас.
В тази програма клас C е получен от клас B (който е получен от базовия клас A).
Обектът obj от клас C е дефиниран във main()
функцията.
Когато display()
функцията се извика, display()
в клас А се изпълнява. Това е така, защото няма display()
функция в клас C и клас B.
Компилаторът първо търси display()
функцията в клас C. Тъй като функцията не съществува там, тя търси функцията в клас B (тъй като C е получена от B).
Функцията също не съществува в клас B, така че компилаторът я търси в клас A (тъй като B се извлича от A).
Ако display()
функцията съществува в C, компилаторът замества display()
клас A (поради заместване на функцията на член).
C ++ Множествено наследяване
При програмирането на C ++ клас може да бъде извлечен от повече от един родител. Например: Клас Bat е получен от базовите класове Mammal и WingedAnimal. Има смисъл, защото прилепът е бозайник, както и крилато животно.
Пример 2: Множествено наследяване при програмиране на 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; )
Изход
Бозайниците могат да раждат директно. Крилатото животно може да се люшка.
Неяснота при множественото наследяване
Най-очевидният проблем с множественото наследяване възниква по време на заместването на функцията.
Да предположим, че два основни класа имат една и съща функция, която не е заменена в производен клас.
Ако се опитате да извикате функцията с помощта на обекта на извлечения клас, компилаторът показва грешка. Това е така, защото компилаторът не знае коя функция да извика. Например,
class base1 ( public: void someFunction( ) (… .… … . ) ); class base2 ( void someFunction( ) (… .… … . ) ); class derived : public base1, public base2 ( ); int main() ( derived obj; obj.someFunction() // Error! )
Този проблем може да бъде решен с помощта на функция за разделителна способност, за да се определи коя функция да се класира или base1 или base2
int main () (obj.base1 :: someFunction (); // Функцията на клас base1 се нарича obj.base2 :: someFunction (); // Извиква се функция на клас base2.)
С ++ Йерархично наследяване
Ако от базовия клас се наследи повече от един клас, това е известно като йерархично наследяване. В йерархичното наследяване, всички функции, които са общи в дъщерните класове, са включени в основния клас.
Например: Физика, Химия, Биология са получени от класа по природни науки.
Синтаксис на йерархично наследяване
клас base_class (…) class first_derived_class: публичен base_class (…) class second_derived_class: public base_class (…) class third_derived_class: public base_class (…)