У цій статті ви дізнаєтесь про різні моделі успадкування у програмуванні на C ++: багаторівневе, багаторівневе та ієрархічне успадкування з прикладами.
Спадкування є однією з основних особливостей об’єктно-орієнтованої мови програмування. Це дозволяє розробникам програмного забезпечення вивести новий клас із існуючого класу. Похідний клас успадковує ознаки базового класу (існуючого класу).
У програмуванні на C ++ існують різні моделі успадкування.
C ++ багаторівневе успадкування
У програмуванні на C ++ не тільки ви можете отримати клас з базового класу, але ви також можете отримати клас з похідного класу. Ця форма успадкування відома як багаторівнева спадщина.
клас А (…); клас B: загальнодоступний A (…); клас C: загальнодоступний B (………);
Тут клас B походить від базового класу A, а клас C походить від похідного класу B.
Приклад 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; )
Вихідні дані
Зміст базового класу.
У цій програмі клас C походить від класу B (який походить від базового класу A).
Об'єкт obj класу C визначений у main()
функції.
Коли display()
функція викликана, display()
у класі A виконується. Це тому, що 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: public base_class (…) class second_derived_class: public base_class (…) class third_derived_class: public base_class (…)