【问题标题】:Will changing a private derived class affect the ABI if I use only pointers to the base class?如果我只使用指向基类的指针,更改私有派生类会影响 ABI 吗?
【发布时间】:2018-05-26 09:40:49
【问题描述】:

我最近一直在阅读有关 C++ 中的 PIMPL 习惯用法及其相对于抽象基类的优势。 PIMPL 的要点之一是,如果实现发生变化,它会保留 ABI。我在互联网上看到了很多文章,甚至在 StackOverflow 中也看到了类似的问题。但是,我一直无法找到以下问题的答案:

假设我有一个基类A 和一个实现(派生类)B。现在,外部代码接收B 对象,但只能通过指向基类A 的指针(并且它们只能使用A 中可用的任何方法或数据成员)。现在如果我更改B 的实现,例如添加新的私有成员,这会导致ABI 损坏吗?我的逻辑告诉我这不应该是这样,因为外部代码对B 一无所知,因此它的更改根本不应该影响外部代码。

如果我错了,谁能告诉我并解释原因?提前谢谢你。

编辑:澄清我在问什么:我有一个程序,其中包含 AB 类(第二个派生自 A,覆盖虚拟方法并添加新的数据成员,所有它们不是“API”类A) 的一部分,它动态加载外部.so 文件(通过dlopen()/dlsym())。问题是当B改变时这些库是否需要重新编译(共享库中的代码只使用A

【问题讨论】:

  • 如果B 覆盖来自A 的函数,这些函数会操纵privateB 成员,那么唯一会破坏的方法。或者,如果覆盖函数依赖于新的 private 变量的状态。
  • 你说的“外部代码”是指“动态链接”吗?
  • @J. Calleja 我已编辑以添加说明

标签: c++ c++11


【解决方案1】:

你是对的——毕竟,有问题的代码在编译时没有任何定义 B 可见,那么它怎么可能是错误的呢?即使B 继承自多个基类(甚至是多个具有虚函数的类),vtable(s) 也包含任何指针调整所需的信息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-19
    • 1970-01-01
    • 2020-04-07
    • 2014-06-16
    • 2022-01-03
    • 1970-01-01
    相关资源
    最近更新 更多