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