【发布时间】:2018-05-26 09:40:49
【问题描述】:
我最近一直在阅读有关 C++ 中的 PIMPL 习惯用法及其相对于抽象基类的优势。 PIMPL 的要点之一是,如果实现发生变化,它会保留 ABI。我在互联网上看到了很多文章,甚至在 StackOverflow 中也看到了类似的问题。但是,我一直无法找到以下问题的答案:
假设我有一个基类A 和一个实现(派生类)B。现在,外部代码接收B 对象,但只能通过指向基类A 的指针(并且它们只能使用A 中可用的任何方法或数据成员)。现在如果我更改B 的实现,例如添加新的私有成员,这会导致ABI 损坏吗?我的逻辑告诉我这不应该是这样,因为外部代码对B 一无所知,因此它的更改根本不应该影响外部代码。
如果我错了,谁能告诉我并解释原因?提前谢谢你。
编辑:澄清我在问什么:我有一个程序,其中包含 A 和 B 类(第二个派生自 A,覆盖虚拟方法并添加新的数据成员,所有它们不是“API”类A) 的一部分,它动态加载外部.so 文件(通过dlopen()/dlsym())。问题是当B改变时这些库是否需要重新编译(共享库中的代码只使用A)
【问题讨论】:
-
如果
B覆盖来自A的函数,这些函数会操纵private的B成员,那么唯一会破坏的方法。或者,如果覆盖函数依赖于新的private变量的状态。 -
你说的“外部代码”是指“动态链接”吗?
-
@J. Calleja 我已编辑以添加说明