OOP ha composizione e sostituzione.
C ++ ha una molteplicità di ereditarietà, specializzazione template, incorporamento e valore / spostamento / puntatore semantica.
Java ha un'unica ereditarietà e interfacce, incorporamento e semantica di riferimento.
Il modo comune con cui la scuola OOP usa questi linguaggi è di utilizzare l'ereditarietà per la sostituzione di oggetti e l'incorporamento per la composizione. Ma hai anche bisogno di un antenato comune e un modo per eseguire il cast in runtime (in C ++ si chiama dynamic_cast
, in Java stai solo chiedendo un'interfaccia da un altro).
Java fa tutto questo con la sua stessa gerarchia di root java.lang.Object
. C ++ non ha una root comune predefinita, quindi dovresti almeno definirla, per arrivare ad una stessa "immagine" (ma questo limita alcune possibilità del C ++ ...).
Dopo di ciò, la possibilità di avere il polimorfismo in fase di compilazione (si pensi al CRTP) e il valore semantico possono offrire anche altre alternative al modo in cui il concetto di "oggetto OOP" può essere trasferito in un programma C ++.
Si può anche immaginare l'eresia di utilizzare l'incorporamento e la conversione implicita per gestire la sostituzione e l'ereditarietà privata per gestire la composizione, invertendo di fatto il paradigma scolastico tradizionale. (Ovviamente, in questo modo è 20 anni più giovane dell'altro, quindi non aspettarti un ampio supporto da parte della comunità nel farlo)
Oppure puoi immaginare una base comune virtuale per tutte le classi, l'interfaccia del modulo (nessuna implementazione) alle classi finali (completamente implementate) passando attraverso interfacce parzialmente implementate e un cluster di interfaccia uniforme, usando "dominanza" come dispacciamento dall'interfaccia alle implementazioni attraverso un schema di ereditarietà "multi stacked-parallelogram".
Confrontando OOP con java con C ++ supponendo che ci sia solo un solo modo OOP sta limitando le capacità di entrambe le lingue.
Forzare C ++ a rispettare rigorosamente gli idiomi di codifica Java è denaturare C ++ come forzare Java a comportarsi come un linguaggio C ++ come la denaturazione di Java.
Non è una questione di "sensibilità" ma di diversi "meccanismi di aggregazione" che le due lingue hanno e un modo diverso di combinarle che rende alcuni idiomi più proficui in una lingua rispetto all'altra e viceversa.