In questo tutorial, impareremo l'ereditarietà in C ++ con l'aiuto di esempi.
L'ereditarietà è una delle caratteristiche chiave della programmazione orientata agli oggetti in C ++. Ci permette di creare una nuova classe (classe derivata) da una classe esistente (classe base).
La classe derivata eredita le funzionalità dalla classe base e può avere funzionalità aggiuntive proprie. Per esempio,
class Animal ( // eat() function // sleep() function ); class Dog : public Animal ( // bark() function );
Qui, la Dog
classe è derivata dalla Animal
classe. Poiché Dog
è derivato da Animal
, i membri di Animal
sono accessibili a Dog
.
![](https://cdn.wiki-base.com/8141271/c_inheritance.png.webp)
Notare l'uso della parola chiave public
mentre si eredita Dog da Animal.
class Dog : public Animal (… );
Possiamo anche usare le parole chiave private
e protected
invece di public
. Impareremo circa le differenze tra l'utilizzo private
, public
e protected
più avanti in questo tutorial.
è una relazione
L'ereditarietà è una relazione . Usiamo l'ereditarietà solo se è presente una relazione is -a tra le due classi.
Ecco alcuni esempi:
- Una macchina è un veicolo.
- L'arancia è un frutto.
- Un chirurgo è un dottore.
- Un cane è un animale.
Esempio 1: semplice esempio di ereditarietà C ++
// C++ program to demonstrate inheritance #include using namespace std; // base class class Animal ( public: void eat() ( cout << "I can eat!" << endl; ) void sleep() ( cout << "I can sleep!" << endl; ) ); // derived class class Dog : public Animal ( public: void bark() ( cout << "I can bark! Woof woof!!" << endl; ) ); int main() ( // Create object of the Dog class Dog dog1; // Calling members of the base class dog1.eat(); dog1.sleep(); // Calling member of the derived class dog1.bark(); return 0; )
Produzione
Posso mangiare! Posso dormire! Posso abbaiare! Bau bau!!
Qui, dog1 (l'oggetto della classe derivata Dog
) può accedere ai membri della classe base Animal
. È perché Dog
è ereditato da Animal
.
// Calling members of the Animal class dog1.eat(); dog1.sleep();
Membri protetti C ++
Il modificatore di accesso protected
è particolarmente rilevante quando si tratta di ereditarietà C ++.
Come i private
membri, i protected
membri sono inaccessibili al di fuori della classe. Tuttavia, è possibile accedervi da classi derivate e classi / funzioni amico .
Abbiamo bisogno di protected
membri se vogliamo nascondere i dati di una classe, ma vogliamo comunque che i dati vengano ereditati dalle sue classi derivate.
Per ulteriori informazioni sulla protezione, fare riferimento al nostro tutorial sui modificatori di accesso C ++.
Esempio 2: membri protetti C ++
// C++ program to demonstrate protected members #include #include using namespace std; // base class class Animal ( private: string color; protected: string type; public: void eat() ( cout << "I can eat!" << endl; ) void sleep() ( cout << "I can sleep!" << endl; ) void setColor(string clr) ( color = clr; ) string getColor() ( return color; ) ); // derived class class Dog : public Animal ( public: void setType(string tp) ( type = tp; ) void displayInfo(string c) ( cout << "I am a " << type << endl; cout << "My color is " << c << endl; ) void bark() ( cout << "I can bark! Woof woof!!" << endl; ) ); int main() ( // Create object of the Dog class Dog dog1; // Calling members of the base class dog1.eat(); dog1.sleep(); dog1.setColor("black"); // Calling member of the derived class dog1.bark(); dog1.setType("mammal"); // Using getColor() of dog1 as argument // getColor() returns string data dog1.displayInfo(dog1.getColor()); return 0; )
Produzione
Posso mangiare! Posso dormire! Posso abbaiare! Bau bau!! Sono un mammifero Il mio colore è nero
Qui, il tipo di variabile è protected
ed è quindi accessibile dalla classe derivata Dog
. Possiamo vederlo come abbiamo inizializzato type
nella Dog
classe usando la funzione setType()
.
D'altra parte, la private
variabile colore non può essere inizializzata in Dog
.
class Dog : public Animal ( public: void setColor(string clr) ( // Error: member "Animal::color" is inaccessible color = clr; ) );
Inoltre, poiché la protected
parola chiave nasconde i dati, non possiamo accedere al tipo direttamente da un oggetto Dog
o da una Animal
classe.
// Error: member "Animal::type" is inaccessible dog1.type = "mammal";
Modalità di accesso in C ++ Ereditarietà
Nelle nostre esercitazioni precedenti, abbiamo imparato a conoscere gli specificatori di accesso C ++ come public, private e protected.
Finora, abbiamo utilizzato la public
parola chiave per ereditare una classe da una classe base esistente in precedenza. Tuttavia, possiamo anche usare le parole chiave private
e protected
per ereditare le classi. Per esempio,
class Animal ( // code ); class Dog : private Animal ( // code );
class Cat : protected Animal ( // code );
The various ways we can derive classes are known as access modes. These access modes have the following effect:
- public: If a derived class is declared in
public
mode, then the members of the base class are inherited by the derived class just as they are. - private: In this case, all the members of the base class become
private
members in the derived class. - protected: The
public
members of the base class becomeprotected
members in the derived class.
The private
members of the base class are always private
in the derived class.
To learn more, visit our C++ public, private, protected inheritance tutorial.
Member Function Overriding in Inheritance
Supponiamo che la classe base e la classe derivata abbiano funzioni membro con lo stesso nome e argomenti.
Se creiamo un oggetto della classe derivata e proviamo ad accedere a quella funzione membro, viene richiamata la funzione membro nella classe derivata invece di quella nella classe base.
La funzione membro della classe derivata sovrascrive la funzione membro della classe base.
Ulteriori informazioni sull'override di funzioni in C ++.
Lettura consigliata: ereditarietà multipla C ++