GeeksforGeeks (Italiano)

La capacità di una classe di derivare proprietà e caratteristiche da un’altra classe è chiamata Ereditarietà. L’ereditarietà è una delle caratteristiche più importanti della programmazione orientata agli oggetti.
Sottoclasse: La classe che eredita le proprietà da un’altra classe è chiamata sottoclasse o Classe derivata.
Classe Super:La classe le cui proprietà sono ereditate dalla sottoclasse è chiamata Classe Base o classe Super.

L’articolo è diviso nei seguenti argomenti secondari:

  1. Perché e quando usare l’ereditarietà?,
  2. Modalità di ereditarietà
  3. Tipi di ereditarietà

Perché e quando usare l’ereditarietà?

Considera un gruppo di veicoli. È necessario creare classi per autobus, auto e camion. I metodi fuelAmount(), capacity (), applyBrakes () saranno uguali per tutte e tre le classi., Se creiamo queste classi evitando l’ereditarietà, dobbiamo scrivere tutte queste funzioni in ciascuna delle tre classi come mostrato nella figura seguente:

Puoi vedere chiaramente che il processo sopra porta alla duplicazione dello stesso codice 3 volte. Ciò aumenta le possibilità di errore e ridondanza dei dati. Per evitare questo tipo di situazione, viene utilizzata l’ereditarietà., Se creiamo un veicolo di classe e scriviamo queste tre funzioni in esso ed ereditiamo il resto delle classi dalla classe del veicolo, allora possiamo semplicemente evitare la duplicazione dei dati e aumentare la riutilizzabilità. Guarda il diagramma seguente in cui le tre classi sono ereditate dalla classe del veicolo:

Usando l’ereditarietà, dobbiamo scrivere le funzioni solo una volta invece di tre volte poiché abbiamo ereditato il resto delle tre classi dalla classe base(Veicolo).,

Implementazione dell’ereditarietà in C++: Per creare una sottoclasse ereditata dalla classe base dobbiamo seguire la sintassi seguente.
Sintassi:

class subclass_name : access_mode base_class_name{ //body of subclass};

Qui, subclass_name è il nome della sottoclasse, access_mode è la modalità in cui si desidera ereditare questa sottoclasse ad esempio: pubblica, privata ecc. e base_class_name è il nome della classe base da cui si desidera ereditare la sottoclasse.
Nota: una classe derivata non eredita l’accesso ai membri dei dati privati., Tuttavia, eredita un oggetto genitore completo, che contiene tutti i membri privati che quella classe dichiara.


Output:

Child id is 7Parent id is 91

Nel programma precedente la classe ‘Child’ viene ereditata pubblicamente dal ‘Classe Parent’ quindi anche i membri dei dati pubblici della classe ‘Parent’ saranno ereditati dalla classe ‘Child’.

Modalità di ereditarietà

  1. Modalità pubblica: se deriviamo una sottoclasse da una classe base pubblica., Quindi il membro pubblico della classe base diventerà pubblico nella classe derivata e i membri protetti della classe base diventeranno protetti nella classe derivata.
  2. Modalità protetta: Se deriviamo una sottoclasse da una classe base protetta. Quindi sia i membri pubblici che i membri protetti della classe base diventeranno protetti nella classe derivata.
  3. Modalità privata: se deriviamo una sottoclasse da una classe base privata. Quindi sia i membri pubblici che i membri protetti della classe base diventeranno privati nella classe derivata.,

Nota : non è possibile accedere direttamente ai membri privati nella classe base nella classe derivata, mentre è possibile accedere direttamente ai membri protetti. Ad esempio, le classi B, C e D contengono tutte le variabili x, y e z nell’esempio seguente. E ‘ solo questione di accesso.,

La seguente tabella riassume i tre modi di cui sopra e mostra l’identificatore di accesso dei membri della classe di base, la classe secondaria quando derivata in public, protected e private modalità:

Tipi di Ereditarietà in C++

Un caso speciale di ibrido eredità : Multipath eredità:
Una classe derivata con due classi di base e queste due classi di base sono una classe base comune è chiamato multipath eredità. Un’ambiguità può sorgere in questo tipo di eredità.,

si Consideri il seguente programma:



Uscita:

A from ClassB : 10A from ClassC : 100B : 20C : 30D : 40

Nell’esempio di cui sopra, sia per ClassB & ClassC ereditare ClassA, entrambi hanno a copia singola di ClassA. Tuttavia ClassD eredita sia ClassB& ClassC, quindi ClassD ha due copie di ClassA, una da ClassB e un’altra da ClassC.,
Se abbiamo bisogno di accedere al membro dei dati a di ClassA attraverso l’oggetto di ClassD, dobbiamo specificare il percorso da cui si accede a, sia che si tratti di ClassB o ClassC, il compilatore bco’z non può distinguere tra due copie di ClassA in ClassD.
Ci sono 2 modi per evitare questa ambiguità:

  1. Usa scope resolution operator
  2. Usa virtual base class

Evita ambiguità usando scope resolution operator:
Usando scope resolution operator possiamo specificare manualmente il percorso da cui si accede al membro a dei dati, come mostrato nelle istruzioni 3 e 4, nell’esempio precedente.,

obj.ClassB::a = 10;
obj.ClassC::a = 100;



Nota : ci sono Ancora due copie di ClassA in ClassD.,
Evitare le ambiguità utilizzando la classe base virtuale:



Uscita:

A : 100B : 20C : 30D : 40

Secondo l’esempio di cui sopra, ClassD è solo una copia di ClassA, pertanto, istruzione 4 sovrascriverà il valore di un dato all’istruzione 3.

Questo articolo è contribuito da Harsh Agarwal. Se ti piace GeeksforGeeks e vorrebbe contribuire, si può anche scrivere un articolo utilizzando contribute.geeksforgeeks.org o posta il tuo articolo a [email protected]., Vedere il tuo articolo che appare sulla pagina principale GeeksforGeeks e aiutare altri Geek.

Lettore di attenzione! Non smettere di imparare ora. Entra in possesso di tutti gli importanti concetti di C++ Foundation e STL con i corsi C++ Foundation e STL ad un prezzo adatto agli studenti e diventa pronto per l’industria.

Tag articolo:

C++
Pratica Tag:

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *