Ereditarietà C ++

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 Dogclasse è derivata dalla Animalclasse. Poiché Dogè derivato da Animal, i membri di Animalsono accessibili a Dog.

Ereditarietà in C ++

Notare l'uso della parola chiave publicmentre si eredita Dog da Animal.

 class Dog : public Animal (… );

Possiamo anche usare le parole chiave privatee protectedinvece di public. Impareremo circa le differenze tra l'utilizzo private, publice protectedpiù 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 privatemembri, i protectedmembri sono inaccessibili al di fuori della classe. Tuttavia, è possibile accedervi da classi derivate e classi / funzioni amico .

Abbiamo bisogno di protectedmembri 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 è protecteded è quindi accessibile dalla classe derivata Dog. Possiamo vederlo come abbiamo inizializzato typenella Dogclasse usando la funzione setType().

D'altra parte, la privatevariabile 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 protectedparola chiave nasconde i dati, non possiamo accedere al tipo direttamente da un oggetto Dogo da una Animalclasse.

 // 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 publicparola chiave per ereditare una classe da una classe base esistente in precedenza. Tuttavia, possiamo anche usare le parole chiave privatee protectedper 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:

  1. 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.
  2. private: In this case, all the members of the base class become private members in the derived class.
  3. protected: The public members of the base class become protected 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 ++

Articoli interessanti...