Может ли кто-нибудь объяснить этот теоретический вопрос об объектной модели C ++? Это было на моем недавнем экзамене, и я был озадачен этим.
Вопрос:
Отмечая успех Java, C # и Smalltalk, Комитет по стандартам C ++ решил добавить дополнительный уровень к объектной модели языка. А именно, каждый класс должен иметь метакласс, который имеет представление во время выполнения.
Оппоненты говорят, что это противоречит одному из фундаментальных принципов языка. Который? Объясните.
Оппоненты также утверждают, что C ++ имеет дополнительный «полууровень», который позволяет использовать некоторые функциональные возможности полноценного уровня метакласса. Что это за «полууровень» и какие класы пользуются его возможностями?
Сторонники выступили с победным аргументом. Добавление уровня обеспечит поддержку фазы Mark в Mark & Уборка мусора (в которой все доступные объекты сначала помечаются, а затем недоступные освобождаются). На какую особенность дополнительного уровня опирается их аргумент?
Кроме того, сторонники выступили с еще одним аргументом. Дополнительный уровень сделает виртуальные деструкторы избыточными, даже без системы сбора мусора. Объясните, когда и зачем нужен виртуальный деструктор и как дополнительный уровень устранит это требование?
Поскольку я не был на вашем курсе, я могу только догадываться:
1: C ++ — это своего рода набор lego — вы берете то, что вам нужно, и можете оставить все остальное. Вы не должны платить за это либо. Добавление этого дополнительного уровня требует некоторой инициализации и прочего, и я полагаю, что вы не можете не использовать его, даже если он вам не нужен.
2: RTTI для классов с vtable
3: Здесь я могу только догадываться — я предполагаю, что все экземпляры класса каким-то образом достижимы мета-классом или могут быть обнаружены путем сканирования памяти. Если это так, вы можете реализовать знак&подметать.
4: виртуальные деструкторы необходимы, если вы уничтожаете экземпляр класса с помощью указателя, который имеет тип одного из базовых классов. Если вы можете получить из каждого экземпляра метакласс, вы можете вызвать правильный деструктор без необходимости искать его в vtable.
Других решений пока нет …