На мою думку, це не стільки визначене питання, скільки питання зручності використання.
Об'єкти - це абстракція, покликана полегшити читання, запис та міркування про складні програми. Для практичного програміста, чи відповідає мова всім критеріям конкретного формального визначення "об'єктно-орієнтованого" (здається, що існує декілька конкуруючих!), Насправді не так важливо, наскільки підходящі для роздумів інструменти, які він пропонує ваша програма з точки зору зазначених об'єктів - тобто фактично отримує передбачувані переваги продуктивності OOP.
У C ++ об'єкти - це дуже жахливі абстракції, які часто змушують програмістів стикатися з неприємними питаннями, пов’язаними з тим, як ці об’єкти структуровані в пам'яті - питання, які більше нагадують кодування в прямому C, ніж інші мови OOP. Наприклад, відповіді, що часто запитують на C ++, пропонують таку критику (серед інших):
Для практикуючого дуже вигідно ознайомитись із системами OO, відмінними від C ++, та з визначеннями OO, відмінними від трійці "інкапсуляція, успадкування, поліморфізм", інтерпретовані спеціальними способами, що дозволяють C ++ вважатися "OO". Наприклад, твердження про те, що навколишнє середовище, якому не вистачає перевірки кордонів або збирання сміття, не є середовищем ОО, звучить неприємно для людей, звикших до C ++. Але з багатьох точок зору це має багато сенсу. Якщо хтось може перезаписати об’єкт, де "інкапсуляція"? Якщо розміщення об'єкта може призвести до звисання посилань або витоку пам'яті, як система "об'єктно-орієнтована" ? А як із вмінням розповісти, який вид об’єкта розташований у заданому місці та часі? Ви кажете, що програмне забезпечення працює з об’єктами - де вони? І якщо цього не вдається дізнатися, як слід налагоджувати програмне забезпечення?
C ++ об'єктно-орієнтована, але неприємно і неповно: її користувачі повинні докласти чимало зусиль, щоб переконатися, що їхні дані справді ведуть себе як "справжні" об'єкти, а не бітові помилки. З цього приводу багато кодів було написано на C ++ впродовж його життєвого циклу, більшість із них використовує класи та динамічну диспетчерику, тому це, очевидно, те, що ви можете використовувати для практичного OOP.