logo

Наслеђивање у Ц++

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

Пример: У следећем примеру Анимал је основна класа, а Дог Цат и Цов су изведене класе које проширују класу Анимал.

анимал_цласс' title=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 }; 

Како наслеђивање функционише у Ц++?

Двотачка (:) са ан спецификација приступа се користи за наслеђивање у Ц++. Омогућава изведеној класи (подређеној класи) да наследи чланове података (поља) и функције чланова (методе) основне класе (родитељске класе).
Када класа наследи другу класу, она добија све доступне чланове родитељске класе, а подређена класа такође може да их редефинише (замени) или да им дода нову функционалност.



дизајн шаблона у Јави

Типови наслеђивања у Ц++

наслеђе' loading='lazy' title=

Испод су различите врсте наслеђивања које подржава Ц++.

јкуери на клик

1. Појединачно наслеђе

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

наслеђе' loading='lazy' title=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. Вишеструко наслеђе

Ин Вишеструко наслеђе једна класа може имати више од једне суперкласе и наследити карактеристике свих родитељских класа.

Мултипле_инхеританце' loading='lazy' title=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. Наслеђивање на више нивоа

Наслеђивање на више нивоа у Ц++ значи да је класа изведена из друге изведене класе формирајући ланац наслеђивања.

Мултилевел_инхеританце' loading='lazy' title=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. Хијерархијско наслеђе

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

јава хасхсет
хијерархијско_наслеђивање' loading='lazy' title=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. Хибридно наслеђе

Када се у једном програму комбинују две или више врста наслеђивања. На пример, класа може користити вишеструко наслеђивање и такође бити део ланца наслеђивања на више нивоа.

хибридИнхеританце' loading='lazy' title=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

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

Напомена : Решење је коришћење виртуелног наслеђивања тако да се дели само једна копија основне класе.

Предности наслеђивања у Ц++

  • Поновна употреба кода : Изведена класа може директно поново користити чланове података и методе своје основне класе избегавајући дуплирање кода.
  • апстракција: Подржава апстрактне класе (класе са чистим виртуелним функцијама) које дефинишу заједнички интерфејс који спроводи апстракцију.
  • Хијерархија класа: Можете изградити хијерархије (база → изведено → даље изведено) за моделирање односа у стварном свету.
  • полиморфизам: Потпуно подржава полиморфизам времена извођења кроз виртуелне функције, као и полиморфизам у времену компајлирања преко преоптерећења функција и шаблона.

Недостаци наслеђивања у Ц++

  • Чврста спојница: Подређена класа постаје зависна од родитељске класе. Свака промена у основној класи може довести до промена у изведеним класама.
  • Смањена флексибилност: Понекад се наслеђивање злоупотребљава тамо где би композиција (има-однос) била боља што би довело до мање флексибилног кода.
  • Повећана сложеност: Дубоке хијерархије наслеђивања (вишестепене или хибридне) могу отежати разумевање код одржавања и отклањања грешака.
  • Проблем са дијамантима: Код хибридног или вишеструког наслеђивања може доћи до двосмислености ако се иста основна класа наслеђује више пута.
  • Износ виртуелних функција: Ако се користи полиморфизам (виртуелне функције), постоје мали трошкови времена рада због претраживања виртуелне табеле.
Креирај квиз