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:
- Perché e quando usare l’ereditarietà?,
- Modalità di ereditarietà
- 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à
- 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.
- 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.
- 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à:
- Usa scope resolution operator
- 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.