Problema del diamante C ++

Problema del diamante C ++
Un problema di diamanti è un problema che si verifica nei linguaggi di programmazione, specialmente in C ++, quando si utilizzano eredità multiple. Le eredità multiple in C ++ sono comunemente usate come strumento quando il codice è molto lungo. Quindi, per gestire il codice sorgente, utilizziamo le classi per gestire il programma. Tuttavia, le eredità multiple causano un problema se non viene utilizzato correttamente. Questi problemi contengono principalmente il problema del diamante. Questo tutorial mira a evidenziare i principali fattori del problema del diamante, come si verifica dalle eredità multiple e tutte le soluzioni necessarie per risolverlo.

Per eseguire i programmi relativi a "C ++ Diamond Eredità" nel sistema operativo Linux, è necessario avere un sistema Ubuntu installato ed in esecuzione sulla macchina virtuale. Vengono utilizzati due strumenti. Uno è qualsiasi strumento di modifica e, come tale, useremo il "editor di testo" predefinito di Linux. È possibile utilizzare altri strumenti di editing preferiti. Il secondo è il terminale Ubuntu. Su cui eseguirai il programma e vedrai l'output visualizzato.

Innanzitutto, discuteremo più eredità nell'articolo, poiché il "problema dei diamanti" si verifica nel caso di avere eredità nel codice sorgente.

Ereditarietà multiple in C++

Quando parliamo dell'uso delle classi gerarchicamente nel programma, sappiamo sempre OOP (programmazione orientata agli oggetti). Perché questa eredità è una caratteristica importante dell'orientata agli oggetti, in cui una sottoclasse è in grado di ereditare da una o più superclassi. In questo modo, una classe per bambini ha due o più genitori.

Ad esempio, se una madre e un padre hanno un figlio in uno scenario della vita reale, il bambino erediterà tutto dai genitori. Quindi questo bambino è noto per essere una classe derivata con madre e padre come genitori. Torniamo alle molteplici eredità. Useremo i "costruttori" come parte della nostra discussione attuale. I costruttori di una classe ereditaria (classe figlio) in eredità multiple eseguono seguendo il loro ordine ereditato. Considerando che per i distruttori, l'ordine è il contrario dell'eredità. Ora citeremo un semplice esempio per dimostrare la funzionalità dell'eredità in C++.

Esempio di eredità multiple

Considera un esempio in cui ci sono due classi, Classe A e Classe B, come classe Parente, e queste due classi hanno una classe figlio denominata Classe C. Questa classe è una classe derivata di entrambi i suoi genitori. Useremo un costruttore nella parte pubblica di ogni classe.

Il primo passo nel codice è utilizzare una libreria per consentire lo streaming input-output:

Quindi dobbiamo dichiarare la classe A, avere i costruttori con il nome della classe. Come sai che i costruttori sono dichiarati con il nome di quella classe, e questi vengono chiamati ogni volta che viene creato l'oggetto. Nel costruttore, è stato visualizzato un semplice messaggio che mostra quale costruttore di classe viene eseguito. Ora, definiamo la classe B con lo stesso approccio. Dopo entrambe le classi genitori, viene menzionata la classe figlio.

Una cosa che si dovrebbe notare qui è l'ordine delle classi genitori che il bambino eredita perché questo ordine avrà importanza al momento dell'esecuzione del costruttore e un messaggio che mostra.

Ora, nella classe principale, creeremo un oggetto della classe figlio. Poiché ha eredità multiple, non è necessario creare l'oggetto per la classe genitore. Vengono eseguiti automaticamente a causa dell'oggetto della classe figlio:

Int main ()
C c;
Restituzione 0;

Dopo aver scritto il codice precedente nell'editor di testo, salva questo file con l'estensione di ".C'. Eseguiremo il file nel terminale Ubuntu. Ai fini dell'esecuzione, è richiesto un compilatore. In C ++, utilizziamo un compilatore G ++. Altrimenti, è necessario prima installarlo:

$ G ++ -o m1 m1.C
$ ./M1

Usa G ++ con il nome del file con il codice sorgente e quello in cui si desidera mostrare l'output. Nota, -O viene utilizzato per salvare l'output. Poiché la Classe B è ereditata sopra la Classe A, quindi il suo costruttore viene eseguito per primo, è possibile vedere l'output dall'immagine precedente.

Poiché il concetto di eredità è chiaro ora, discuteremo del "problema dei diamanti" qui.

Problema di diamanti

Un problema di diamanti è un caso solo in eredità multiple che si verifica quando una classe infantile ha i valori ereditati dai due genitori. In cui queste classi genitori sono ereditate da una classe di nonni comune.

Ad esempio, considera un esempio in cui abbiamo una classe figlio ereditata dalle classi di madre e padre. Queste classi ereditano una terza classe chiamata "persona":

Bambino> madre> persona
> Padre> Persona

Quindi, secondo lo scenario dato, la classe figlio eredita la classe "persona" due volte nel programma. Una volta, viene dalla madre e, di nuovo, la seconda volta è dal padre. Questo crea confusione per il compilatore per eseguire prima il costruttore. Questa situazione provoca un grafico ereditario a forma di diamante. Quindi, è noto come "il problema del diamante".

L'approccio del codice è quasi lo stesso. Dichiarare la classe base e poi due lezioni ereditate figlio (madre, padre) della classe base. Ogni classe è seguita dal costruttore con una variabile per archiviare un valore in esso:

Ora, introducendo la classe figlio:

# Class Child: Public Father, Public Mother

La classe figlio erediterà entrambe le classi genitori. La funzione principale utilizzerà l'oggetto del figlio e un valore nel parametro della chiamata del costruttore:

Dopo aver salvato il codice, è tempo di utilizzare il compilatore per l'esecuzione e vedere il risultato:

Ora, puoi osservare che la classe di base è chiamata due volte. Questo è un problema di diamante. Dopo aver descritto il problema, ora troveremo una possibile soluzione.

Soluzione del problema del diamante

La soluzione dipende dall'uso della parola chiave "virtuale". Le classi a due genitori con una classe di base comune erezzeranno ora la classe di base praticamente per ridurre al minimo il verificarsi di copie della classe base nella classe figlio. Ora modificheremo il codice utilizzando quella parola chiave:

Ogni volta che la classe genitore eredita dalla classe nonna, viene utilizzato "virtuale" ma solo con i genitori, non nel caso di un bambino. Questa è "l'eredità virtuale". Limita il passaggio di più di una singola istanza dalla classe base da passare.

# Classe Padre: persona pubblica virtuale

Ora eseguiremo il codice. I valori risultanti mostrano che l'ambiguità viene rimossa usando questo concetto:

Per evitare la ripetizione del costruttore di base da chiamare, il costruttore per una classe di base virtuale non viene raggiunto attraverso la classe che l'ha ereditata. Tuttavia, questo costruttore viene chiamato dal costruttore di classe concreta. Nell'esempio attuale, la classe figlio chiama direttamente il costruttore di classe "persona".

Conclusione

"C ++ Diamond Problem" è un articolo scritto per rimuovere l'ambiguità della ripetizione della classe base in eredità multiple. Il concetto di eredità è spiegato brevemente con esempi. Allo stesso modo, la causa e la soluzione per il problema del diamante sono anche elaborati in dettaglio. Speriamo che questo tutorial possa fornirti una guida nel campo dei programmi C ++.