sho*_*tsy 33 c++ virtual binary-compatibility
我正在为C++库设计一个API,它将分发在一个dll/shared对象中.该库包含具有虚函数的多态类.我担心如果我在DLL API上公开这些虚函数,我就不会使用更多虚函数扩展相同的类,而不会破坏与为以前版本的库构建的应用程序的二进制兼容性.
一种选择是使用PImpl习惯用法来隐藏所有具有虚函数的类,但这似乎也有它的局限性:这样,应用程序就失去了对类的子类进行子类化并覆盖虚方法的可能性.
您将如何设计一个可以在应用程序中进行子类化的API类,而不会失去在新版本的dll中使用(非抽象)虚拟方法扩展API同时保持向后二进制兼容的可能性?
更新:库的目标平台是windows/msvc和linux/gcc.
P S*_*ved 32
几个月前,我写了一篇名为"在GNU/Linux系统上用C++实现的共享库的二进制兼容性"的文章[ pdf ].虽然Windows系统上的概念类似,但我确信它们并不完全相同.但是阅读完这篇文章后,您可以了解C++二进制级别上与兼容性有关的内容.
顺便说一下,GCC应用程序二进制接口总结在标准文档草案" Itanium ABI "中,因此您将拥有一个您选择的编码标准的正式基础.
仅举一个简单的例子:在GCC中,如果没有其他类继承它,你可以扩展一个具有更多虚函数的类.阅读文章以获得更好的规则.
但无论如何,规则有时太复杂而无法理解.因此,您可能会对验证两个给定版本的兼容性的工具感兴趣:适用于Linux的abi-compliance-checker.