English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
In questo articolo, imparerai diversi modelli di ereditarietà nel programming C++, con esempi di ereditarietà multipla, multi-livello e gerarchica.
EreditarietàÈ una delle funzionalità fondamentali del programming orientato agli oggetti. Permette agli sviluppatori software di derivare una nuova classe da una classe esistente. La classe derivata eredita le funzionalità della classe base (classe esistente).
Ci sono molti modelli di ereditarietà nel programming C++.
Nel programming C++, non si può derivare una classe solo da una classe base, ma anche da una classe derivata. Questo tipo di ereditarietà si chiama ereditarietà multi-livello.
class A { ... .. ... }; class B: public A { ... .. ... }; class C: public B { ... ... ... };
Qui, il tipo B deriva dalla classe base A, il tipo C deriva dalla classe derivata B.
#include <iostream> using namespace std; class A { public: void display() { cout << "Contenuto della classe base."; {} }; class B : public A { }; class C : public B { }; int main() { C obj; obj.display(); return 0; {}
Risultato di output
Contenuto della classe base.
In questo programma, il tipo C deriva dal tipo B (il tipo B deriva dal tipo base A).
L'oggetto obj del tipo C viene definito nella funzione main().
Quando si chiama la funzione display(), viene eseguita la funzione display() del tipo A. Questo perché non esiste una funzione display() nel tipo C e nel tipo B.
Il compilatore cerca prima la funzione display() nel tipo C. Poiché questa funzione non esiste nel tipo C, verrà cercata nel tipo B (poiché C deriva da B).
Questa funzione display() non esiste nemmeno nella classe B, quindi il compilatore la cerca nella classe A (poiché B deriva da A)).
Se esiste una funzione display() in C, il compilatore sovrascriverà la funzione display() della classe A (poichéSovrascrittura dei membri della funzione)
Nel programming C++, una classe può derivare da più classi padre. Ad esempio: la classe Bat deriva dalle classi base Mammal e WingedAnimal. Questo ha senso perché il pipistrello è sia un mammifero (Mammal) che un animale con ali (WingedAnimal).
#include <iostream> using namespace std; class Mammal { public: Mammal() { cout << "Gli mammiferi possono nascere direttamente." << endl; {} }; class WingedAnimal { public: WingedAnimal() { cout << "Gli animali con ali possono battere le ali." << endl; {} }; class Bat : public Mammal, public WingedAnimal { }; int main() { Bat b1; return 0; {}
Risultato di output
Gli mammiferi possono nascere direttamente. Gli animali con ali possono battere le ali.
Il problema più evidente della multiereditarietà si verifica durante la sovrascrittura delle funzioni.
Supponiamo che due classi base abbiano la stessa funzione, ma non viene sovrascritta nella classe deriva.
Se si tenta di chiamare la funzione con un oggetto della classe deriva, il compilatore mostrerà un errore. Questo perché il compilatore non sa quale funzione chiamare. Ad esempio:
class base1 { public: void someFunction() { ... ... ... } }; class base2 { void someFunction() { ... ... ... } }; class derived : public base1, public base2 { }; int main() { derived obj; obj.someFunction() // Errore! {}
Questo problema può essere risolto specificando quale funzione appartiene a base1 o base2 utilizzando la funzione di risoluzione dell'ambito.
int main() { obj.base1::someFunction(); // Chiamata alla funzione della classe base1 obj.base2::someFunction(); // Chiamata alla funzione della classe base2 {}
Se si ereditano più classi da una classe base, si chiama ereditarietà gerarchica. Nell'ereditarietà gerarchica, tutte le funzionalità comuni delle classi figlie sono incluse nella classe base.
Ad esempio: fisica, chimica, biologia provengono dalla lezione di scienze.
class base_class { ... .. ... {} class first_derived_class: public base_class { ... .. ... {} class second_derived_class: public base_class { ... .. ... {} class third_derived_class: public base_class { ... .. ... {}