Наслеђе је основни концепт у ООП (Објектно оријентисано програмирање) . То је механизам којим је једној класи дозвољено да наследи карактеристике (поља и методе) друге класе. Наслеђивање подразумева креирање нових класа на основу постојећих. Класа која наслеђује другу класу може поново да користи методе и поља те класе.
Пример: У следећем примеру Анимал је основна класа, а Дог Цат и Цов су изведене класе које проширују класу Анимал.
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
Објашњење:
- Анимал је основна класа са функцијом соунд().
- Дог Цат и Цов су изведене класе које дефинишу сопствени соунд() метод.
- У маин() објекти Дог Цат и Цов се креирају одвојено.
- Када позовемо соунд() на сваком објекту, покреће се одговарајућа метода деце (пас лаје Мачка мјауче Крава мучи).
Синтакса
C++class ChildClass : public ParentClass { // Additional fields and methods };
Како наслеђивање функционише у Ц++?
Двотачка (:) са ан спецификација приступа се користи за наслеђивање у Ц++. Омогућава изведеној класи (подређеној класи) да наследи чланове података (поља) и функције чланова (методе) основне класе (родитељске класе).
Када класа наследи другу класу, она добија све доступне чланове родитељске класе, а подређена класа такође може да их редефинише (замени) или да им дода нову функционалност.
дизајн шаблона у Јави
Типови наслеђивања у Ц++
Испод су различите врсте наслеђивања које подржава Ц++.
јкуери на клик
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. Наслеђивање на више нивоа
Наслеђивање на више нивоа у Ц++ значи да је класа изведена из друге изведене класе формирајући ланац наслеђивања.
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
Хибридно наслеђивање може довести до проблем са дијамантима у Ц++. Ово се дешава када класа наслеђује две класе које обе деле исту основну класу. Као резултат тога, изведена класа добија више копија чланова основне класе, што ствара нејасноћу о томе коју ће користити.
Напомена : Решење је коришћење виртуелног наслеђивања тако да се дели само једна копија основне класе.
Предности наслеђивања у Ц++
- Поновна употреба кода : Изведена класа може директно поново користити чланове података и методе своје основне класе избегавајући дуплирање кода.
- апстракција: Подржава апстрактне класе (класе са чистим виртуелним функцијама) које дефинишу заједнички интерфејс који спроводи апстракцију.
- Хијерархија класа: Можете изградити хијерархије (база → изведено → даље изведено) за моделирање односа у стварном свету.
- полиморфизам: Потпуно подржава полиморфизам времена извођења кроз виртуелне функције, као и полиморфизам у времену компајлирања преко преоптерећења функција и шаблона.
Недостаци наслеђивања у Ц++
- Чврста спојница: Подређена класа постаје зависна од родитељске класе. Свака промена у основној класи може довести до промена у изведеним класама.
- Смањена флексибилност: Понекад се наслеђивање злоупотребљава тамо где би композиција (има-однос) била боља што би довело до мање флексибилног кода.
- Повећана сложеност: Дубоке хијерархије наслеђивања (вишестепене или хибридне) могу отежати разумевање код одржавања и отклањања грешака.
- Проблем са дијамантима: Код хибридног или вишеструког наслеђивања може доћи до двосмислености ако се иста основна класа наслеђује више пута.
- Износ виртуелних функција: Ако се користи полиморфизам (виртуелне функције), постоје мали трошкови времена рада због претраживања виртуелне табеле.