English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

教程基础 C++

Controllo di flusso di C++

Funzione in C++

Array e stringhe di C++

Strutture dati di C++

Classi e oggetti di C++

Puntatore in C++

Ereditarietà in C++

Tutorial STL in C++

Manuale di riferimento di C++

Controllo degli accessi di ereditarietà in C++ (public, protected, private)

In questo articolo, imparerai a utilizzare l'ereditarietà pubblica, protetta e privata in C++. Imparerai attraverso esempi dove e come utilizzarla.

Puoi dichiarare una classe deriva da una classe base con diversi specificatori di accesso.classecioè pubblicaEreditarietàereditarietà protetta o ereditarietà privata.

#include <iostream>
using namespace std;
class base
{
.... ... ....
};
class derived : access_specifier base
{
.... ... ....
};

Attenzione:È possibile utilizzare le parole chiave public, protected o private al posto dell'access_specifier utilizzato nel codice sopra:Specificatore di accesso)termini.

Controllo dell'accesso e ereditarietà

La classe deriva può accedere a tutti i membri non privati della classe base. Pertanto, se si desidera che i membri della classe base non vengano acceduti dai membri delle funzioni della classe deriva, devono essere dichiarati come private nella classe base.

Possiamo riassumere diversi tipi di accesso in base ai permessi di accesso, come indicato di seguito:

Accessopublicprotectedprivate
Stessa classeyesyesyes
Sottoclasseyesyesno
Classi esterneyesnono

Una sottoclasse herita tutti i metodi delle classi base, eccetto i seguenti casi:

  • Costruttori, distruttori e costruttori di copia della classe base.

  • Operatori sovraccaricati della classe base.

  • funzioni amiche della classe base.

Tipo di ereditarietà

Quando una classe deriva da una classe base, la classe base può essere ereditata come public、protected o private tipi. Il tipo di ereditarietà è specificato dal modulo di accesso access-specifier spiegato sopra.

Non usiamo quasi protected o private Ereditarietà, di solito si utilizza public Ereditarietà. Quando si utilizzano diversi tipi di ereditarietà, seguire le seguenti regole:

  • Ereditarietà pubblica(public):Quando una classe deriva daPubblicodella classe basePubblicomembri sono anchePubblicomembri, i membriProtezionemembri sono ancheProtezionemembri, i membriPrivatoI membri non possono essere direttamente acceduti dalla sottoclasse, ma possono essere chiamati tramitePubblicoeProtezionemembri per accedervi.

  • Ereditarietà protetta(protected): Quando una classe deriva daProtezionedella classe basePubblicoeProtezioneI membri diventanoProtezionemembri.

  • Ereditarietà privata(private):Quando una classe deriva daPrivatodella classe basePubblicoeProtezioneI membri diventanoPrivatomembri.

Ereditarietà multipla

L'ereditarietà multipla significa che una sottoclasse può avere più classi genitore, ereditando le caratteristiche di più classi genitore.

Un'istanza di classe C++ può ereditare membri da più classi, la sintassi è la seguente:

class <Nome della classe derivata>:<Modo di ereditare 1><Nome della classe base 1>,<Modo di ereditare 2><Nome della classe base 2>,…
{
<Corpo della classe derivata>
};

In cui il modo di ereditare l'access modifier è public、protected o private Di questi, uno viene utilizzato per decorare ogni classe base, e le classi base tra loro sono separate da virgola, come mostrato di seguito. Ora diamo un'occhiata a questo esempio:

#include <iostream>
 
using namespace std;
 
// 基类 Shape
class Shape 
{
   public:
      void setWidth(int w)
      {
         width = w;
      }
      void setHeight(int h)
      {
         height = h;
      }
   protected:
      int width;
      int height;
};
 
// 基类 PaintCost
class PaintCost 
{
   public:
      int getCost(int area)
      {
         return area * 70;
      }
};
 
// 派生类
class Rectangle: public Shape, public PaintCost
{
   public:
      int getArea()
      { 
         return (width * height); 
      }
};
 
int main(void)
{
   Rettangolo Rect;
   int area;
 
   Rect.setWidth(5);
   Rect.setHeight(7);
 
   area = Rect.getArea();
   
   // Output dell'area dell'oggetto
   cout << "Area totale: " << Rect.getArea() << endl;
 
   // Output della spesa totale
   cout << "Spesa totale: $" << Rect.getCost(area) << endl;
 
   return 0;
}

Quando il codice sopra viene compilato ed eseguito, produrrà i seguenti risultati:

Area totale: 35
Spesa totale: $2450