使用抽象 class 没有疙瘩的 C++ abi 兼容性

C++ abi compatability without pimpl using abstract class

假设我有一个 class B_Impl 继承并实现了纯抽象 class B(不包含任何数据字段)。

假设 class A 仅通过 B* 使用 B_Impl

如果我向 B_Impl.h 添加一个字段(很明显,A 不包括),是否会保留 ABI 兼容性?

我认为,它不会被保留,- 阅读后 https://wiki.qt.io/D-Pointer

但我可以在我的应用程序中看到,在更改 B_Impl.h 之后,class A 的对象文件 重新生成,所有内容仍然很好用。

也许,这是因为在我的应用程序中 AB 是同一个应用程序的一部分,而 B 不是 A 调用的库?或者是因为 vtable 始终位于内存中的第一个字段并且向 B_Impl.h 添加另一个字段(在 B“下方”)不会改变 vtable是第一个字段?还是链接器以某种方式纠正了这些东西,而不是通过重新生成 A-object-file?

老实说,我在这里有点困惑:

If I add a field to B_Impl.h (clearly, not included by A), will ABI compatability be preserved?

是的。如果翻译单元不包含 B_Impl 的定义,则更改为 B_Impl 不会影响兼容性。

接口兼容性 - 无论是 API 还是 ABI - 仅在使用接口时才重要。在您的示例中,使用了 B 的接口;不是 B_Impl.

的界面

Is this ABI problem is only about libraries?

B_Impl 是否在图书馆应该无关紧要。