OOP ha composizione e sostituzione.
Il C ++ ha ereditarietà multipla, specializzazione di template, incorporamento e semantica value / move / pointer.
Java ha ereditarietà e interfacce singole, incorporamento e semantica di riferimento.
Il modo comune in cui la scuola OOP utilizza queste lingue è utilizzare l'eredità per la sostituzione degli oggetti e l'incorporamento per la composizione. Ma hai anche bisogno di un antenato comune e di un modo per eseguire il cast di runtime (in C ++ viene chiamato dynamic_cast
, in Java è solo chiedere un'interfaccia da un altro).
Java fa tutto questo con la sua java.lang.Object
gerarchia radicata. Il C ++ non ha una radice comune predefinita, quindi dovresti almeno definirla, per arrivare alla stessa "immagine" (ma questo sta limitando alcune possibilità del C ++ ...).
Successivamente, la possibilità di avere un polimorfismo in fase di compilazione (pensa a CRTP) e un valore semantico può offrire anche altre alternative al modo in cui il concetto di "oggetto OOP" può essere portato in un programma C ++.
Puoi persino immaginare l'eresia di usare l'incorporamento e la conversione implicita per gestire la sostituzione e l'eredità privata per gestire la composizione, invertendo di fatto il tradizionale paradigma scolastico. (Certo, 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 virtuale comune a tutte le classi, interfaccia modulo (nessuna implementazione) a classi finali (completamente implementate) che attraversano interfacce parzialmente implementate e cluster di interfacce uniformi, usando "dominanza" come invio da interfaccia a implementazioni attraverso un "multi stack -parallelogramma "schema ereditario.
Confrontando OOP con Java e C ++ supponendo che ci sia un solo modo OOP sta limitando le capacità di entrambe le lingue.
Costringere C ++ ad aderire rigorosamente agli idiomi della codifica Java sta denaturando C ++ poiché costringere Java a comportarsi come un linguaggio simile al C ++ sta denaturando 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 un linguaggio più redditizio in una lingua rispetto all'altra e viceversa.