На мой взгляд, это не столько проблема определения, сколько проблема юзабилити.
Объекты - это абстракция, предназначенная для облегчения чтения, написания и анализа сложных программ. Для практического программиста то, соответствует ли язык всем критериям определенного формального определения «объектно-ориентированного» (кажется, что есть несколько конкурирующих!), Не так важно, как подходящие инструменты, которые он предлагает, для размышлений ваша программа с точки зрения указанных объектов - т.е. фактически пожинает предполагаемые преимущества производительности ООП.
В C ++ объекты представляют собой чрезвычайно утечку абстракций, часто заставляющую программистов сталкиваться с неприятными проблемами, связанными с тем, как эти объекты структурированы в памяти, - проблемами, которые больше напоминают кодирование на прямом C, чем в других языках ООП. Например, C ++ Часто задаваемые вопросы предлагает эту критику (среди прочих):
Для практикующего специалиста очень полезно ознакомиться с ОО-системами, отличными от С ++, и с определениями ОО, отличными от троицы «инкапсуляция, наследование, полиморфизм», которые интерпретируются особым образом, позволяя рассматривать С ++ как «ОО». Например, утверждение о том, что среда, в которой отсутствует проверка границ или сборка мусора, не является ОО-средой, звучит возмутительно для людей, привыкших к C ++. Но со многих точек зрения это имеет большой смысл. Если кто-то может перезаписать объект, где находится «инкапсуляция»? Если удаление объекта может привести к зависанию ссылок или утечке памяти, как система «объектно-ориентирована» ? А как насчет способности сказать, какой объект находится в данном месте и времени? Вы говорите, что программное обеспечение работает с объектами - где они? И если не удается выяснить, как можно отлаживать программное обеспечение?
C ++ является объектно-ориентированным, но неприятным и неполным: его пользователи должны приложить немало усилий, чтобы убедиться, что их данные на самом деле ведут себя как «реальные» объекты, а не как ошибочные биты. Тем не менее, много кода было написано на C ++ за время его жизни, большая часть которого использует классы и динамическую диспетчеризацию, так что это само собой разумеется, что вы можете использовать для практического ООП.