Рассмотрим существующую иерархию классов C ++: один корневой класс, множество дочерних классов, образующих прямой ациклический граф.
Я хотел бы добавить метод в корневой класс и, возможно, переопределить его в некоторых дочерних элементах. Но проблема в том, что мне запрещено изменять эти существующие классы (сторонняя библиотека, политика проекта, закрытый источник и т. Д.).
Тогда будет смешан класс расширения / расширения.быть хорошим решением.Но это не тривиально в C ++.
Быстрое и грязное решение состоит в том, чтобы написать функцию, отправляющую тип объекта с помощью оператора dynamic_cast , и выполнить требуемый код длякаждый тип иерархии.Но это несколько плохая практика, так как она подвержена ошибкам при записи, она нарушает инкапсуляцию и не поддерживает безопасно будущие изменения.
Я думаю о том, чтобы где-нибудь поддерживать какую-то хеш-таблицу с определением {идентификатор типа rtti, функция для вызова}", и используйте это как поддельный VTable для функции, которую я хочу написать и переопределить. Но я не уверен, что будет лучше...
Любые другие идеи? Изменение VTable среды исполнения? Решение для метапрограммирования шаблонов? Другое?
Не забывайте: я определенно не могу изменить исходные классы (ни заголовки, ни реализацию).