Ereditarietà C ++

Uno dei concetti più importanti nella programmazione orientata agli oggetti è quello dell'ereditarietà. L'ereditarietà ci consente di definire una classe in termini di un'altra classe, il che semplifica la creazione e la manutenzione di un'applicazione. Ciò offre anche l'opportunità di riutilizzare la funzionalità del codice e tempi di implementazione rapidi.

Quando si crea una classe, invece di scrivere membri dati e funzioni membro completamente nuovi, il programmatore può designare che la nuova classe erediti i membri di una classe esistente. Questa classe esistente è chiamatabase class e la nuova classe è indicata come derived classe.

L'idea di eredità implementa il is arelazione. Ad esempio, mammifero È-A animale, cane È-A mammifero quindi anche cane È-A animale e così via.

Classi di base e derivate

Una classe può essere derivata da più classi, il che significa che può ereditare dati e funzioni da più classi base. Per definire una classe derivata, usiamo un elenco di derivazione della classe per specificare la / le classe / i di base. Un elenco di derivazione di classi nomina una o più classi di base e ha la forma:

class derived-class: access-specifier base-class

Dove access-specifier è uno dei public, protected, o privatee base-class è il nome di una classe definita in precedenza. Se l'identificatore di accesso non viene utilizzato, è privato per impostazione predefinita.

Considera una classe base Shape e la sua classe derivata Rectangle come segue -

#include <iostream>
 
using namespace std;

// Base class
class Shape {
   public:
      void setWidth(int w) {
         width = w;
      }
      void setHeight(int h) {
         height = h;
      }
      
   protected:
      int width;
      int height;
};

// Derived class
class Rectangle: public Shape {
   public:
      int getArea() { 
         return (width * height); 
      }
};

int main(void) {
   Rectangle Rect;
 
   Rect.setWidth(5);
   Rect.setHeight(7);

   // Print the area of the object.
   cout << "Total area: " << Rect.getArea() << endl;

   return 0;
}

Quando il codice precedente viene compilato ed eseguito, produce il seguente risultato:

Total area: 35

Controllo degli accessi ed ereditarietà

Una classe derivata può accedere a tutti i membri non privati ​​della sua classe base. Pertanto i membri della classe base che non dovrebbero essere accessibili alle funzioni membro delle classi derivate dovrebbero essere dichiarati privati ​​nella classe base.

Possiamo riassumere i diversi tipi di accesso in base a - chi può accedervi nel modo seguente -

Accesso pubblico protetto privato
Stessa classe
Classi derivate no
Fuori dalle classi no no

Una classe derivata eredita tutti i metodi della classe base con le seguenti eccezioni:

  • Costruttori, distruttori e costruttori di copia della classe base.
  • Operatori sovraccaricati della classe base.
  • Le funzioni friend della classe base.

Tipo di eredità

Quando si deriva una classe da una classe base, la classe base può essere ereditata tramite public, protected o privateeredità. Il tipo di ereditarietà è specificato dallo specificatore di accesso come spiegato sopra.

Usiamo a malapena protected o private eredità, ma publicl'ereditarietà è comunemente usata. Durante l'utilizzo di diversi tipi di ereditarietà, vengono applicate le seguenti regole:

  • Public Inheritance - Quando si ricava una classe da a public classe base, public i membri della classe base diventano public membri della classe derivata e protected i membri della classe base diventano protectedmembri della classe derivata. Una classe baseprivate i membri non sono mai accessibili direttamente da una classe derivata, ma è possibile accedervi tramite chiamate a public e protected membri della classe base.

  • Protected Inheritance - Quando derivante da a protected classe base, public e protected i membri della classe base diventano protected membri della classe derivata.

  • Private Inheritance - Quando derivante da a private classe base, public e protected i membri della classe base diventano private membri della classe derivata.

Ereditarietà multipla

Una classe C ++ può ereditare membri da più di una classe ed ecco la sintassi estesa:

class derived-class: access baseA, access baseB....

Dove l'accesso è uno dei public, protected, o privatee verrebbero forniti per ogni classe di base e saranno separati da virgola come mostrato sopra. Proviamo il seguente esempio:

#include <iostream>
 
using namespace std;

// Base class Shape
class Shape {
   public:
      void setWidth(int w) {
         width = w;
      }
      void setHeight(int h) {
         height = h;
      }
      
   protected:
      int width;
      int height;
};

// Base class PaintCost
class PaintCost {
   public:
      int getCost(int area) {
         return area * 70;
      }
};

// Derived class
class Rectangle: public Shape, public PaintCost {
   public:
      int getArea() {
         return (width * height); 
      }
};

int main(void) {
   Rectangle Rect;
   int area;
 
   Rect.setWidth(5);
   Rect.setHeight(7);

   area = Rect.getArea();
   
   // Print the area of the object.
   cout << "Total area: " << Rect.getArea() << endl;

   // Print the total cost of painting
   cout << "Total paint cost: $" << Rect.getCost(area) << endl;

   return 0;
}

Quando il codice precedente viene compilato ed eseguito, produce il seguente risultato:

Total area: 35
Total paint cost: $2450