A mio avviso, non è tanto un problema di definizione quanto un problema di usabilità.
Gli oggetti sono un'astrazione pensata per rendere più facile la lettura, la scrittura e la motivazione di programmi complessi. Per un programmatore pratico, se una lingua soddisfa tutti i criteri di una particolare definizione formale di "orientato agli oggetti" (sembra che ci siano molti concorrenti!) Non è tanto importante quanto se gli strumenti che offre siano adatti a pensare il tuo programma in termini di detti oggetti - cioè, in realtà miete i supposti benefici di produttività di OOP.
In C ++, gli oggetti sono un'astrazione terribilmente leaky , costringendo spesso i programmatori a confrontarsi con problemi sgradevoli legati al modo in cui questi oggetti sono strutturati in memoria - problemi che ricordano più la codifica in modo C che altre lingue OOP. Ad esempio, Domande frequenti su C ++ offre questa critica (tra le altre):
It is very beneficial for a practitioner to gain familiarity with OO
systems other than C++, and with OO definitions other than the
"encapsulation, inheritance, polymorphism" trinity interpreted in
special ways allowing C++ to be considered "OO". For example, a claim
that an environment lacking boundary checking or garbage collection is
not an OO environment sounds outrageous to people accustomed to C++.
But from many perspectives, it makes a lot of sense. If anyone can
overwrite an object, where's the "encapsulation"? If disposing an
object can lead to dangling references or memory leaks, how is the
system "object-oriented"? What about the ability to tell what kind of
object is located at a given place and time? You say the software
works with objects - where are they? And if one can't find out, how is
one supposed to debug the software?
C ++ è orientato agli oggetti, ma spiacevolmente e in modo incompleto: i suoi utenti devono dedicare molto impegno per assicurarsi che i loro dati si comportino come oggetti "reali" piuttosto che come bit erranti. Detto questo, un sacco di codice è stato scritto in C ++ per tutta la sua durata, la maggior parte di esso fa uso di classi e dispatch dinamici, quindi è evidentemente qualcosa che puoi usare per OOP pratico .