Как разработать C ++ API для двоичной совместимости расширяемости
Я разрабатываю API для библиотеки C ++, которая будет распространяться в объекте dll / shared. Библиотека содержит полиморические классы с виртуальными функциями. Я обеспокоен тем, что если я представлю эти виртуальные функции в API-интерфейсе DLL, я откажусь от возможности расширения тех же классов с помощью большего количества виртуальных функций без нарушения бинарной совместимости с приложениями, созданными для предыдущей версии библиотеки.
Одним из вариантов будет использованиеPimpl идиома, чтобы скрыть все классы, имеющие виртуальные функции, но, похоже, они тоже естьОграничения: в этом случае приложения теряют возможность создавать подклассы классов библиотеки и переопределять виртуальные методы.
Как бы вы разработали класс API, который можно разделить на подклассы в приложении, не теряя возможности расширять API с помощью (не абстрактных) виртуальных методов в новой версии DLL, оставаясь при этом обратно совместимым с двоичным кодом?
Обновление: целевыми платформами для библиотеки являются windows / msvc и linux / gcc.