Спадкування в C++
Спадковість є фундаментальним поняттям в ООП (об'єктно-орієнтоване програмування) . Це механізм, за допомогою якого одному класу дозволяється успадковувати функції (поля та методи) іншого класу. Успадкування означає створення нових класів на основі існуючих. Клас, який успадковує від іншого класу, може повторно використовувати методи та поля цього класу.
приклад: У наступному прикладі Animal є базовим класом, а Dog Cat і Cow є похідними класами, які розширюють клас Animal.
Inheritance C++ #include using namespace std ; class Animal { public : void sound () { cout < < 'Animal makes a sound' < < endl ; } }; class Dog : public Animal { public : void sound () { cout < < 'Dog barks' < < endl ; } }; class Cat : public Animal { public : void sound () { cout < < 'Cat meows' < < endl ; } }; class Cow : public Animal { public : void sound () { cout < < 'Cow moos' < < endl ; } }; int main () { Dog d ; d . sound (); Cat c ; c . sound (); Cow cow ; cow . sound (); return 0 ; }
Вихід
Dog barks Cat meows Cow moos
Пояснення:
- Animal є базовим класом із функцією sound().
- Dog Cat і Cow є похідними класами, кожен з яких визначає власний метод sound().
- У main() об’єкти Dog Cat і Cow створюються окремо.
- Коли ми викликаємо sound() для кожного об’єкта, виконується відповідний метод дочірнього класу (Собака гавкає, Кіт нявкає, Корова мигне).
Синтаксис
C++ class ChildClass : public ParentClass { // Additional fields and methods };
Як працює успадкування в C++?
Двокрапка (:) з an специфікатор доступу використовується для успадкування в C++. Це дозволяє похідному класу (класу-дочірньому) успадковувати члени даних (поля) і функції-члени (методи) базового класу (класу-батька).
Коли клас успадковує інший клас, він отримує всі доступні члени батьківського класу, а дочірній клас також може перевизначити (замінити) або додати до них нові функції.
Типи успадкування в C++
Нижче наведено різні типи успадкування, які підтримуються C++.
1. Єдине успадкування
При одинарному успадкуванні підклас походить лише від одного суперкласу. Він успадковує властивості та поведінку однобатьківського класу. Іноді його також називають простим успадкуванням.
Single Inheritance C++ #include using namespace std ; class Vehicle { public : Vehicle () { cout < < 'This is a Vehicle' < < endl ; } }; class Car : public Vehicle { public : Car () { cout < < 'This Vehicle is Car' < < endl ; } }; int main () { Car obj ; return 0 ; }
Вихід
This is a Vehicle This Vehicle is Car
2. Множинне успадкування
в Множинне успадкування один клас може мати більше ніж один суперклас і успадковувати функції від усіх батьківських класів.
Multiple Inheritance C++ #include using namespace std ; class LandVehicle { public : void landInfo () { cout < < 'This is a LandVehicle' < < endl ; } }; class WaterVehicle { public : void waterInfo () { cout < < 'This is a WaterVehicle' < < endl ; } }; // Derived class inheriting from both base classes class AmphibiousVehicle : public LandVehicle public WaterVehicle { public : AmphibiousVehicle () { cout < < 'This is an AmphibiousVehicle' < < endl ; } }; int main () { AmphibiousVehicle obj ; obj . waterInfo (); obj . landInfo (); return 0 ; }
Вихід
This is an AmphibiousVehicle This is a WaterVehicle This is a LandVehicle
3. Багаторівневе успадкування
Багаторівневе успадкування в C++ означає, що клас є похідним від іншого похідного класу, утворюючи ланцюжок успадкування.
Multilevel Inheritance C++ #include using namespace std ; class Vehicle { public : Vehicle () { cout < < 'This is a Vehicle' < < endl ; } }; // Derived class from Vehicle class FourWheeler : public Vehicle { public : FourWheeler () { cout < < '4 Wheeler Vehicles' < < endl ; } }; // Derived class from FourWheeler class Car : public FourWheeler { public : Car () { cout < < 'This 4 Wheeler Vehicle is a Car' < < endl ; } }; int main () { Car obj ; return 0 ; }
Вихід
This is a Vehicle 4 Wheeler Vehicles This 4 Wheeler Vehicle is a Car
4. Ієрархічне успадкування
При ієрархічному успадкуванні більше одного підкласу успадковується від одного базового класу. тобто більше ніж один похідний клас створюється з одного базового класу. Наприклад, і автомобілі, і автобуси є транспортними засобами.
Hierarchical Inheritance C++ #include using namespace std ; class Vehicle { public : Vehicle () { cout < < 'This is a Vehicle' < < endl ; } }; class Car : public Vehicle { public : Car () { cout < < 'This Vehicle is Car' < < endl ; } }; class Bus : public Vehicle { public : Bus () { cout < < 'This Vehicle is Bus' < < endl ; } }; int main () { Car obj1 ; Bus obj2 ; return 0 ; }
Вихід
This is a Vehicle This Vehicle is Car This is a Vehicle This Vehicle is Bus
5. Гібридне успадкування
Коли в одній програмі поєднуються два або більше типів успадкування. Наприклад, клас може використовувати множинне успадкування, а також бути частиною багаторівневого ланцюга успадкування.
Hybrid Inheritance C++ #include using namespace std ; class Vehicle { public : Vehicle () { cout < < 'This is a Vehicle' < < endl ; } }; class Fare { public : Fare () { cout < < 'Fare of Vehicle' < < endl ; } }; class Car : public Vehicle { public : Car () { cout < < 'This Vehical is a Car' < < endl ; } }; class Bus : public Vehicle public Fare { public : Bus () { cout < < 'This Vehicle is a Bus with Fare' ; } }; int main () { Bus obj2 ; return 0 ; }
Вихід
This is a Vehicle Fare of Vehicle This Vehicle is a Bus with Fare
Гібридне успадкування може призвести до алмазна проблема на C++. Це трапляється, коли клас успадковується від двох класів, які мають спільний базовий клас. У результаті похідний клас отримує кілька копій членів базового класу, що створює неоднозначність щодо того, який з них використовувати.
Примітка: Рішення полягає у використанні віртуального успадкування, щоб спільно використовувати лише одну копію базового класу.
Переваги успадкування в C++
- Повторне використання коду : Похідний клас може безпосередньо повторно використовувати члени даних і методи свого базового класу, уникаючи дублювання коду.
- Абстракція: Підтримує абстрактні класи (класи з чистими віртуальними функціями), які визначають загальний інтерфейс, що забезпечує абстракцію.
- Ієрархія класів: Ви можете будувати ієрархії (базова → похідна → подальша похідна) для моделювання зв’язків у реальному світі.
- Поліморфізм: Повністю підтримує поліморфізм часу виконання через віртуальні функції, а також поліморфізм під час компіляції через перевантаження функцій і шаблони.
Недоліки успадкування в C++
- Жорстке зчеплення: Дочірній клас стає залежним від батьківського класу. Будь-яка зміна в базовому класі може викликати зміни в похідних класах.
- Знижена гнучкість: Іноді успадкування використовується неправильно, коли композиція (відношення має) була б кращою, що призвело б до менш гнучкого коду.
- Підвищена складність: Глибокі ієрархії успадкування (багаторівневі або гібридні) можуть ускладнити розуміння коду, підтримувати та налагоджувати.
- Алмазна проблема: З гібридним або множинним успадкуванням неоднозначність може виникнути, якщо той самий базовий клас успадковується кілька разів.
- Накладні витрати на віртуальні функції: Якщо використовується поліморфізм (віртуальні функції), виникає невеликий час виконання через пошук віртуальної таблиці.