我正在为一个 C++ 库设计一个 API,它将分布在一个 dll / 共享对象中。该库包含具有虚函数的多态类。我担心如果我在 DLL API 上公开这些虚拟函数,我就无法使用更多的虚拟函数扩展相同的类,而不会破坏与为该库的先前版本构建的应用程序的二进制兼容性。
一种选择是使用PImpl习惯用法来隐藏所有具有虚函数的类,但这似乎也有其局限性:这样应用程序就失去了对库的类进行子类化和覆盖虚方法的可能性。
您将如何设计一个可以在应用程序中子类化的 API 类,同时又不会失去在新版本的 dll 中使用(非抽象)虚拟方法扩展 API 的可能性,同时保持向后二进制兼容?
更新:库的目标平台是 windows/msvc 和 linux/gcc。