OOП Наследство - INHERITANCE

    Еден од најважните концепти во објектно-ориентираното програмирање е тој на наследството. Наследството ни овозможува да дефинираме класа во смисла на друга класа, што го олеснува креирањето и одржувањето на апликацијата. Ова исто така дава можност за повторна употреба на функционалноста на кодот и брзо време на имплементација.

    Кога креирате класа, наместо да пишувате целосно нови членови на податоци и функции на членови, можете да определите дека новата класа треба да ги наследува членовите на постојната класа. Оваа постоечка класа се нарекува основна класа, а новата класа се нарекува изведена класа.

На пример, цицач е животно, куче е цицач, па оттука и куче е животно и така натаму.

Основни и изведени класи

    Класа може да се изведе од повеќе класи, што значи дека може да наследи податоци и функции од повеќе основни класи. За да дефинираме изведена класа, ние користиме список со деривации на класа за да ја одредиме основната класа (и). Список за изведување на класа именува една или повеќе основни класи.

class izvedena_klasa: specifikaror_za_pristap osnovna_klasa

Каде што спецификаторот за пристап е еден од public, protected или private, а основната класа е името на претходно дефинираната класа. Ако спецификаторот за пристап не се користи, тогаш тој е стандарден приватен.

Видови на наследство

Постојат различни видови на наследство:

  1. Единечна наследност
  2. Повеќекратно наследство
  3. Наследство во повеќе нивоа
  4. Хиерархиска наследност
  5. Хибридна (виртуелна) наследност

Единечна наследност

Единечното наследство претставува форма на наследство кога има само една основна класа и една изведена класа.

  Пример 1

Нека основната класа е Фигура и, а изведената класа Правоаголник ja наследува

#include <iostream> 

using namespace std;

 

// osnovna klasa Figura

class Figura {

   protected:

      int sirina;

      int visina;

 

   public:

      void setSirina(int s) {

         sirina = s;

      }

      void setVisina(int v) {

         visina = v;

      }

     

};

 

// Izvedena klasa

class Pravoagolnik: public Figura {

   public:

      int povrsina() {

         return (sirina * visina);

      }

};

 

int main(void) {

   Pravoagolnik Pr;

   int povrs;

   Pr.setSirina(5);

   Pr.setVisina(7);

   povrs= Pr.povrsina();

  

   // Presmetuva i pecati povrsina na objekt.

   cout << "Povrsina: " << Pr.povrsina() << endl;

    return 0;

} 

Повеќекратно наследство

Повеќекратно наследување претставува еден вид наследство кога изведена класа наследува својства од повеќе класи. На пример, постојат три класи А, Б и Ц, а изведената класа е Д, како што е прикажано подолу:

 

Ако сакате да креирате класа со повеќе основни класи, треба да ја користите следнава синтакса:

class izvedena_klasa: specifikator_za_pristap osnovna_klasa1,...,specifikator_za_pristap osnovna_klasaN

Пример за повеќекратно наследување

#include <iostream>

using namespace std;

 

// Osnovna klasa

class Prva_OK {

  public:

    void Funkcija() {

      cout << "Nekoja sodrzina od prvata osnovna klasa." ;

    }

};

 

// Vtora osnovna klasa

class Vtora_OK{

  public:

    void VtoraFunkcija() {

      cout << " Nekoja sodrzina od vtora osnovna klasa." ;

    }

};

 

// Izvedena klasa

class Izvedena: public Prva_OK, public Vtora_OK{

};

 

int main() {

  Izvedena Klasa;

  Klasa.Funkcija();

  Klasa.VtoraFunkcija();

  return 0;

}

Пример 3 
Нека основната класа е Фигура и класата Боење, а изведената класа Правоаголник ги наследува двете основни класи

 

#include <iostream>
using namespace std;
 
// osnovna klasa Figura
class Figura {
   protected:
      int sirina;
      int visina;
 
   public:
      void setSirina(int s) {
         sirina = s;
      }
      void setVisina(int v) {
         visina = v;
      }
      
};
 
// Osnovna klasa Cena
class Cena{
   public:
      int getCena(int povrs) {
         return povrs* 70;
      }
};
 
// Izvedena class
class Pravoagolnik: public Figura, public Cena
{
   public:
      int povrsina() {
         return (sirina * visina); 
      }
};
 
int main(void) {
   Pravoagolnik Pr;
   int povrs;
 
   Pr.setSirina(5);
   Pr.setVisina(7);
 
   povrs= Pr.povrsina();
   
   // Presmetuva i pecati povrsina na objekt.
   cout << "Povrsina: " << Pr.povrsina() << endl;
 
   // Presmetuva i pecati cena na boenje na objekt
   cout << "Cena na povrsina: " << Pr.getCena(povrs) << endl;
 
   return 0;
}